定义函数时,哪种类型是lambda函数/表达式
When defining a function, what type is a lambda function/expression?
我想定义一个函数,该函数(除了通常的输入参数)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; });
如果您服用std::function<int(int,int)>
,它将有开销,但它会做您想要的。它甚至会在C 14中正确超载。
如果您不想键入删除和std::function
的分配开销,则可以这样做:
template<
class F,
class R=std::result_of_t<F&(int,int)>,
class=std::enable_if_t<std::is_same<int,R>{}>
>
int myfunc( const int a, F&& f )
或检查转换性到int
而不是相同。这是Sfinae解决方案。 1
这将正确负载。我用一些C 14个功能进行简洁。将blah_t<?>
替换为C 11中的typename blah<?>::type
。
另一个选项是static_assert
类似的子句。这会生成最佳错误消息。
最后,您可以使用它:如果无法按照您的使用方式使用代码。
在C 1Z概念中,将有更轻松/更少的代码沙拉来执行Sfinae解决方案。
1 在某些编译器上std::result_of
与Sfinae无法播放。在这些上,用decltype(std::declval<F&>()(1,1))
替换。除非您的编译器不支持C 11(例如MSVC 2013和2015),这将有效。(幸运的是2013/3015具有不错的result_of
)。
有两种替代方案,类型的 std::function<signature>
强迫特定的签名符合您的问题的线条,但它施加了一些额外的成本(主要是不能在一般而言。替代方法是使用模板将最后一个参数作为通用对象。从性能的角度来看,这种方法可以更好,但是您将语法检查留给了编译器(我认为这不是问题)。其中一条评论提到将lambda作为功能指针 ,但这仅适用于没有捕获的lambdas。
我个人会选择第二种选择:
template <typename Fn>
int myFunc(const int a, Fn&& f) {
return f(a, a) * 2;
}
请注意,虽然这不会明确强制特定签名,但编译器将强制执行f
使用两个int
可调用,并产生可以乘以2并转换为int
的东西。
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda