std::function
是一种类型的擦除对象。这意味着它消除了某些操作的发生的细节,并为他们提供了统一的运行时间接口。为了 std::function
, , 首要的1 操作是副本/移动,破坏和“调用” operator()
- “呼叫运算符的功能”。
用较少的英语,这意味着 std::function
几乎可以包含任何像您称呼它的函数指针一样起作用的对象。
它支持的签名在角度支架内部: std::function<void()>
进行零论点,什么也没返回。 std::function< double( int, int ) >
花两个 int
争论和返回 double
. 。一般来说, std::function
支持存储任何类似函数的对象,其参数可以从其参数列表中转换,并且可以将其返回值转换为返回值。
重要的是要知道 std::function
Lambdas和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对应于结果匿名类型的构造函数及其成员变量,grogng_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
}
};
请注意 C ++ 20 模板参数已添加到lambdas中,上面没有涵盖。
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 此外,还存储了RTTI(TypeID),并包括铸造至原始类型操作。