将函数对象传递给构造函数
Passing a function object to a constructor
我想要实现的是制作一个可以将不同仿函数作为参数的仿函数。
编辑:我的问题的原因,"most vexing parse",以及解决方案都有很好的描述:参见this question and answer, the whole most-vexing-parse tag, and even the wikipedia page。仍然,我在提问之前无法确定问题所在,并将留下这个问题,因为它可能会对其他人有所帮助。
我做了什么:
头文件中functor.hpp
:
#ifndef FUNCTOR_HPP
#define FUNCTOR_HPP
#include <functional>
template <typename T, typename BinOp = typename std::plus<T>>
struct doer {
BinOp op;
doer(BinOp o = std::plus<T>()) : op(o) {}
T operator()(const T& a, const T& b) const
{ return op(a, b); }
};
#endif // FUNCTOR_HPP
有了这个头文件,我可以写一个这样的程序functor.cpp
:
#include <iostream>
#include "functor.hpp"
int main()
{
doer<int> f;
std::cout << f(3, 7) << std::endl;
}
我可以编译并 运行 它得到,如预期的那样:
$ make functor
g++ -std=c++14 -pedantic -Wall functor.cpp -o functor
$ ./functor
10
$
我正在努力寻找一种方法来使用不同的运算符(而不是 std::plus<T>
)来实例化我的 doer
。
doer<int, std::multiplies<int>> f2(std::multiplies<int>());
编译没有问题,但我一直没能找到调用f2(3, 7)
的方法来得到乘积21。例如,如果我在程序中添加另一行:
int r = f2(3, 7);
并尝试编译,我得到:
$ make functor
g++ -std=c++14 -pedantic -Wall functor.cpp -o functor
functor.cpp: In function ‘int main()’:
functor.cpp:10:20: error: invalid conversion from ‘int’ to ‘std::multiplies<int> (*)()’ [-fpermissive]
int r = f2(3, 7);
^
functor.cpp:10:20: error: too many arguments to function ‘doer<int, std::multiplies<int> > f2(std::multiplies<int> (*)())’
functor.cpp:9:37: note: declared here
doer<int, std::multiplies<int>> f2(std::multiplies<int>());
^
functor.cpp:10:20: error: cannot convert ‘doer<int, std::multiplies<int> >’ to ‘int’ in initialization
int r = f2(3, 7);
^
这是怎么回事?似乎 f2(3, 7)
几乎没有调用重载的 operator()
...
最令人烦恼的解析。试试这个:
doer<int, std::multiplies<int>> f2((std::multiplies<int>()));
或者这个:
doer<int, std::multiplies<int>> f2 = std::multiplies<int>();
或者这个:
doer<int, std::multiplies<int>> f2{std::multiplies<int>()};
我想要实现的是制作一个可以将不同仿函数作为参数的仿函数。
编辑:我的问题的原因,"most vexing parse",以及解决方案都有很好的描述:参见this question and answer, the whole most-vexing-parse tag, and even the wikipedia page。仍然,我在提问之前无法确定问题所在,并将留下这个问题,因为它可能会对其他人有所帮助。
我做了什么:
头文件中functor.hpp
:
#ifndef FUNCTOR_HPP
#define FUNCTOR_HPP
#include <functional>
template <typename T, typename BinOp = typename std::plus<T>>
struct doer {
BinOp op;
doer(BinOp o = std::plus<T>()) : op(o) {}
T operator()(const T& a, const T& b) const
{ return op(a, b); }
};
#endif // FUNCTOR_HPP
有了这个头文件,我可以写一个这样的程序functor.cpp
:
#include <iostream>
#include "functor.hpp"
int main()
{
doer<int> f;
std::cout << f(3, 7) << std::endl;
}
我可以编译并 运行 它得到,如预期的那样:
$ make functor
g++ -std=c++14 -pedantic -Wall functor.cpp -o functor
$ ./functor
10
$
我正在努力寻找一种方法来使用不同的运算符(而不是 std::plus<T>
)来实例化我的 doer
。
doer<int, std::multiplies<int>> f2(std::multiplies<int>());
编译没有问题,但我一直没能找到调用f2(3, 7)
的方法来得到乘积21。例如,如果我在程序中添加另一行:
int r = f2(3, 7);
并尝试编译,我得到:
$ make functor
g++ -std=c++14 -pedantic -Wall functor.cpp -o functor
functor.cpp: In function ‘int main()’:
functor.cpp:10:20: error: invalid conversion from ‘int’ to ‘std::multiplies<int> (*)()’ [-fpermissive]
int r = f2(3, 7);
^
functor.cpp:10:20: error: too many arguments to function ‘doer<int, std::multiplies<int> > f2(std::multiplies<int> (*)())’
functor.cpp:9:37: note: declared here
doer<int, std::multiplies<int>> f2(std::multiplies<int>());
^
functor.cpp:10:20: error: cannot convert ‘doer<int, std::multiplies<int> >’ to ‘int’ in initialization
int r = f2(3, 7);
^
这是怎么回事?似乎 f2(3, 7)
几乎没有调用重载的 operator()
...
最令人烦恼的解析。试试这个:
doer<int, std::multiplies<int>> f2((std::multiplies<int>()));
或者这个:
doer<int, std::multiplies<int>> f2 = std::multiplies<int>();
或者这个:
doer<int, std::multiplies<int>> f2{std::multiplies<int>()};