我有一个接受函数作为参数的模板。
当我尝试传递 lambda 表达式时,它不会编译。
typedef int (*func)(int a);
template <func foo>
int function(int a)
{
foo(a);
}
int test(int a)
{
return a;
}
int main()
{
function<test>(1); // ---> this is ok
auto lambda = [](int a) -> int { return a; };
function<lambda>(1); // ---> this is wrong, why?
return 0;
}
我错过了什么?
原文由 gsf 发布,翻译遵循 CC BY-SA 4.0 许可协议
lambda 不是函数指针! lambda 是编译器生成的类的实例!
但是,非捕获 lambda 可以使用它的
operator+
转换为函数指针这是一个例子:
可悲的是,
operator+
在您的情况下甚至都不起作用,因为它尚未声明为 constexpr,因此您不能在模板参数中使用它。解决您的情况的方法是使用免费功能…在不接受 N4487 之前,您不能期望将 lambda 作为模板参数传递。
另一个解决方法是创建自己的仿函数而不是 lambda:
这个解决方案不是很吸引人,但如果
LambdaType
隐藏在 cpp 文件中,它可能会很有用。如果您的目标只是能够内联代码的编译器,则可以使用模板来传递 lambda:
由于编译器知道每个实例的
T
的类型,一个好的编译器应该能够优化出 lambda。使用 clang,第三个选项提供以下程序集:
我使用
-std=c++14 -Ofast -march=native
作为标志。