我有必要使用 std::function 但是我不知道以下语法是什么意思。

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

使用的目标是什么 std::function?是为函数的指针吗?

有帮助吗?

解决方案

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
  }
};

请注意 模板参数已添加到lambdas中,上面没有涵盖。

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

1 此外,还存储了RTTI(TypeID),并包括铸造至原始类型操作。

其他提示

让我们分开界线:

std ::功能

这是函数不使用参数的声明,并且没有返回值。如果函数返回 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

带有捕获(状态lambdas)的Lambdas不能互相分配,因为它们具有独特的类型,即使它们看起来完全相同。为了能够用捕获量存储和传递兰伯达人,我们可以使用”std ::功能“保持由lambda表达式构建的函数对象。基本上”std ::功能“是,能够为Lambda函数对象分配具有不同内容结构的lambda函数。

EXP:

auto func = [](int a){
 cout << "a:" << a << endl;
};
func(40);
//
int x = 10;
func = [x](int a){ //ATTENTION(ERROR!): assigning a new structure to the same object
 cout << "x:" << x << ",a:" << a << endl;
};
func(2);

因此上述用法将是不正确的。但是,如果我们用“ std ::函数”定义一个函数对象:

auto func = std::function<void(int)>{};
func = [](int a){
  cout << "a:" << a << endl;
};
func(40);
//
int x = 10;
func = [x](int a){ //CORRECT. because of std::function
  //...
}; 

int y = 11;
func = [x,y](int a){ //CORRECT
 //...
}; 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top