将Functor转换为Type of Object函数

时间:2016-11-30 19:27:33

标签: c++ templates parameters functor function-object

说我有这个功能:

template <typename T>
void foo(function<T(const T&, const T&)> op, const T& lhs, const T& rhs) {
    cout << op(lhs, rhs) << endl;
}

这是legal code

function<int(const int&, const int&)> op = plus<int>();

foo(op, 13, 42);

但是当我这样做时:

foo(plus<int>(), 13, 42)

我收到错误:

  

调用foo(std::plus<int>, int, int)

时没有匹配功能

为什么我可以从function<int(const int&, const int&)>初始化plus<int>()类型的对象,但我无法将plus<int>()传递给function<T(const T&, const T&)>类型的参数?是否与模板有关?

1 个答案:

答案 0 :(得分:2)

引自标准部分14.8.1.6:

  

将对某个函数执行隐式转换(第4条)   将其转换为相应函数类型的参数   参数类型不包含模板参数的参数   参与模板参数演绎。

这在您的情况下不起作用,因为未明确提供模板参数。编译器需要进行演绎。因此,根据上述内容,它不会从仿函数到std::function进行隐式转换。

所以,你可以这样做(正如@flatmouse在评论中提到的那样):

foo<int>(plus<int>(), 13, 42);

这是有效的,因为没有需要执行的模板参数推导,因为显式指定了所有模板参数。根据标准的上述引用,隐式转换应该适用于此。