【发布时间】:2016-09-27 00:36:51
【问题描述】:
我正在尝试匹配 C++ 模板中的可调用对象,并根据作为参数接收的可调用对象的类型提供不同的实现。
我有以下模板函数:
template<class Ret, class... Args>
void fun(std::function<Ret(Args...)> f) {}
template<class Ret, class... Args>
void fun(Ret(*f)(Args...)) {}
它们接受std::function 对象和普通函数指针,并正确推断出它们的返回Ret 和参数Args 类型。但是,我在传递匿名 lambda 表达式时遇到了困难,因为它们与上面的任何模板都不匹配。
调用类似的东西
fun([](int x, int y){return x + y;})
导致编译错误。实现接受匿名 lambda 函数的模板表达式的正确方法是什么?也许一种方法是检查正在传递的类是否具有operator() 方法?
【问题讨论】:
标签: c++ templates lambda std-function