gpt4 book ai didi

c++ - std::function 的目的是什么以及如何使用它?

转载 作者:IT老高 更新时间:2023-10-28 21:34:48 28 4
gpt4 key购买 nike

我必须使用 std::function 但我不知道下面的语法是什么意思。

std::function<void()> f_name = []() { FNAME(); };

使用std::function的目的是什么?是做一个函数的指针吗?

最佳答案

std::function是一个类型删除对象。这意味着它删除了一些操作如何发生的细节,并为它们提供了一个统一的运行时接口(interface)。对于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。对应的是:

struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};

上述简单伪函数类型的实例。像上面这样的实际类是由编译器“发明”的,具有实现定义的唯一名称(通常包括用户定义类型不能包含的符号)(我不知道您是否有可能在不发明的情况下遵循标准这样一个类,但我所知道的每个编译器实际上都创建了这个类)。

完整的 lambda 语法如下所示:

[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}

但许多部分可以省略或留空。 capture_list 对应于生成的匿名类型的构造函数及其成员变量,argument_list 对应于 operator() 的参数。 ,返回类型为返回类型。当使用 capture_list 创建实例时,也会神奇地调用 lambda 实例的构造函数。

[ capture_list ]( argument_list ) -> return_type { code }

基本上变成了

struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};

请注意,在 模板参数被添加到 lambdas 中,上面没有介绍。

[]<typename T>( std::vector<T> const& v ) { return v.size(); }

1另外存储RTTI(typeid),包括cast-back-to-original-type操作。

关于c++ - std::function 的目的是什么以及如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20353210/

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