gpt4 book ai didi

c++ - 定义函数时,lambda 函数/表达式是什么类型?

转载 作者:太空狗 更新时间:2023-10-29 23:50:28 24 4
gpt4 key购买 nike

我想定义一个接受(除了它通常的输入参数之外)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<?>typename blah<?>::type在 C++11 中。

另一种选择是 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 )。

关于c++ - 定义函数时,lambda 函数/表达式是什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com