Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将函子转换为function类型的对象_C++_Templates_Parameters_Functor_Function Object - Fatal编程技术网

C++ 将函子转换为function类型的对象

C++ 将函子转换为function类型的对象,c++,templates,parameters,functor,function-object,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; } 模板 无效foo(功能op、常数T和lhs、常数T和rhs){ 引用标准第14.8.1.6节: 隐式转换(第4条)将在函数上执行 参

假设我有这个功能:

template <typename T>
void foo(function<T(const T&, const T&)> op, const T& lhs, const T& rhs) {
    cout << op(lhs, rhs) << endl;
}
模板
无效foo(功能op、常数T和lhs、常数T和rhs){

引用标准第14.8.1.6节:

隐式转换(第4条)将在函数上执行 参数将其转换为相应函数的类型 参数,如果参数类型不包含 参与模板参数推导

这在您的情况下不起作用,因为没有显式提供模板参数。编译器需要进行推断。因此,如上所述,它不会执行从functor到
std::function
的隐式转换

因此,您可以这样做(正如@flatmouse在评论中提到的):

foo(plus(),13,42);


这是因为没有需要执行的模板参数推断,因为所有模板参数都是显式指定的。根据上面引用的标准,隐式转换应该可以做到这一点。

隐式类型转换在模板参数推断期间不起作用。@Arunmu我想有例外根据这条规则:@Arunmu这就是答案,因为如果我删除模板,它会起作用:那么我怎么知道
plus()
function
之间的转换是隐式的呢?@W.F是的,我认为数组到指针和函数到函数指针衰减都有例外。你可以使用
foo(std::plus{},13,42)
感谢《标准》的引用,这是一个很好的答案。我很快就会接受……很高兴能提供帮助。谢谢。
function<int(const int&, const int&)> op = plus<int>();

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