0

我正在尝试保存一段代码并在之后使用它。所以我将能够将自动变量声明为全局,分配它然后调用该块:

// In the header
auto __myblock; // error

然后:

__myblock=[]()
{
    <code>
};
<other code>
__myblock();

但问题是我得到一个语法错误:似乎我必须在声明它的那一刻初始化变量,所以我无法记住该块并在之后使用它。我需要将该块作为全局变量记忆或在一个类中。也在一个类中,我不允许将自动声明为实例变量。有没有办法?

4

1 回答 1

2

您的问题中有两个问题:

  1. 我可以提前声明自动变量吗(在初始化之前)
  2. 如何存储 lambda 函数

第一个问题的答案是“否”:自动变量的声明必须伴随着初始化。你不能有:

auto x;  // error
x = 42;

本身,因为编译器不会在声明中知道 x 应该是什么。另一方面:

auto x = 42;

是有效的,因为42是int,所以编译器为x分配一个整数

对于第二个问题,使用 std::function。它已尽可能优化。有一些细节需要考虑。具体来说:代码块 <code> 是否引用了 lambda 函数范围之外的变量。如果是这样,您是否希望它按值或按引用引用这些变量。所有这些变量都必须存储在某个地方(也称为捕获),这就是 std::function 所做的。如果您没有任何捕获,std::function 基本上是一个简单的函数指针,它已尽可能优化。在标题有:

// with no capture:
std::function<void()> _myblock;

// if you have capture (say, two integers)
std::function<void(int,int)> _myblock

并且在源头上有:

// no capture:
_myblock = []() { <code> }

// with capture:
_myblock = [x,y]( int x, int y) { <code> }

最后,正如其中一位评论者指出的那样,如果您没有捕获,最好的办法是简单地将 <code> 代码分解为一个函数,然后简单地稍后调用它。

于 2012-10-14T14:33:49.110 回答