我想要定义一个函数(除了通常的输入参数)为lambda函数。我希望尽可能地限制这个函数(它自己的输入和返回类型)。
int myfunc( const int a, LAMBDA_TYPE (int, int) -> int mylamda )
{
return mylambda( a, a ) * 2;
}这样,我就可以按以下方式调用该函数:
int input = 5;
myfunc( input, [](int a, int b) { return a*b; } );定义myfunc的正确方法是什么?
有没有一种方法来定义默认的lambda?如下所示:
int myfunc( const int a, LAMBDA_TYPE = [](int a, int b) { return a*b; });发布于 2015-05-06 12:21:34
有两种选择,类型擦除std::function<signature>强制执行一个与您的问题类似的特定签名,但它会增加一些额外的成本(主要是不能在一般情况下内联)。另一种方法是使用模板保留最后一个参数作为泛型对象。从性能的角度来看,这种方法可能更好,但您将语法检查留给编译器(我不认为这是一个问题)。其中一个注释提到将lambda作为函数指针传递,但这只适用于没有捕获的lambda。
我个人赞成第二种选择:
template <typename Fn>
int myFunc(const int a, Fn&& f) {
return f(a, a) * 2;
}请注意,虽然这并不显式地强制使用特定的签名,但编译器将强制使用两个int调用f,并生成可以乘以2并转换为int的内容。
https://stackoverflow.com/questions/30075804
复制相似问题