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)