c – std :: function的用法和语法
作者:互联网
我有必要使用std :: function但我不知道以下语法的含义.
std::function<void()> f_name = []() { FNAME(); };
使用std :: function的目标是什么?它是否指向函数?
解决方法:
std :: function是一种类型擦除对象.这意味着它会删除某些操作发生的细节,并为它们提供统一的运行时接口.对于std :: function,操作是复制/移动和’调用’与operator() – ‘函数类似于调用操作符’.
在较少深奥的英语中,这意味着std :: function几乎可以包含任何对象,就像你调用它时的函数指针一样.
它支持的签名位于尖括号内:std :: function< void()>取零参数并且不返回任何内容.的std ::功能< 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 { 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
}
};
标签:std-function,c,function-pointers 来源: https://codeday.me/bug/20191003/1850855.html