我有必要使用 std::function
但我不知道下面的语法是什么意思。
std::function<void()> f_name = []() { FNAME(); };
使用 std::function
的目标是什么?是指向函数的指针吗?
原文由 user2982229 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有必要使用 std::function
但我不知道下面的语法是什么意思。
std::function<void()> f_name = []() { FNAME(); };
使用 std::function
的目标是什么?是指向函数的指针吗?
原文由 user2982229 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们把这条线分开:
标准::函数
这是一个不带参数且不返回值的函数的声明。如果函数返回 int
,它看起来像这样:
std::function<int()>
同样,如果它也采用 int 参数:
std::function<int(int)>
我怀疑你的主要困惑是下一部分。
[]() { FNAME(); };
[]
部分称为 _捕获子句_。在这里,您放置了 lambda 声明的本地变量,并且您希望 在 lambda 函数本身中可用。这就是说“我不希望任何东西被捕获”。如果这是在类定义中并且您希望该类可用于 lambda,您可以这样做:
[this]() { FNAME(); };
下一部分是传递给 lambda 的参数, _就像它是一个常规函数一样_。如前所述, std::function<void()>
是指向不带参数的方法的签名,所以这也是空的。
其余部分是 lambda 本身的主体,就好像它是一个常规函数一样,我们可以看到它只是调用函数 FNAME
。
另一个例子
假设您有以下签名,即可以将两个数字相加的东西。
std::function<int(int, int)> sumFunc;
我们现在可以这样声明一个 lambda:
sumFunc = [](int a, int b) { return a + b; };
不确定您是否使用 MSVC,但这里有一个指向 lamda 表达式语法的链接:
http://msdn.microsoft.com/en-us/library/dd293603.aspx
原文由 Moo-Juice 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
std::function
是一个类型擦除对象。这意味着它删除了一些操作如何发生的细节,并为它们提供了一个统一的运行时接口。对于std::function
,主要的1操作是复制/移动、销毁和使用operator()
的“调用”——“调用运算符之类的功能”。在不太深奥的英语中,这意味着
std::function
可以包含几乎任何在你如何调用它时充当函数指针的对象。它支持的签名放在尖括号内:
std::function<void()>
接受零参数并且不返回任何内容。std::function< double( int, int ) >
接受两个int
参数并返回double
。一般来说,std::function
支持存储任何类函数对象,其参数可以从其参数列表转换,并且其返回值可以转换为其返回值。重要的是要知道
std::function
和 lambdas 是不同的,如果兼容的话,野兽。该行的下一部分是一个 lambda。这是 C++11 中的新语法,增加了编写简单的类函数对象的能力——可以使用
()
调用的对象。这样的对象可以被类型擦除并存储在std::function
中,代价是一些运行时开销。[](){ code }
特别是一个非常简单的 lambda。它对应于:上述简单伪函数类型的一个实例。像上面这样的实际类是由编译器“发明”的,具有实现定义的唯一名称(通常包括用户定义类型不能包含的符号)(我不知道您是否有可能在不发明的情况下遵循标准这样一个类,但我知道的每个编译器实际上都创建了这个类)。
完整的 lambda 语法如下所示:
但许多部分可以省略或留空。 capture_list 对应于生成的匿名类型及其成员变量的构造函数,argument_list
operator()
的参数,返回类型是返回类型。当使用 capture_list 创建实例时,也会神奇地调用 lambda 实例的构造函数。基本上变成
请注意,在 c++20 中,模板参数被添加到 lambdas 中,上面没有提到。
1另外,存储了RTTI(typeid),包括cast-back-to-original-type操作。