有没有办法保存自动变量并在之后使用它?

时间:2012-10-14 00:12:43

标签: c++ c++11 auto

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

// In the header
auto __myblock; // error

然后:

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

但问题是我遇到了语法错误:似乎我必须在声明它的那一刻初始化变量,因此我无法记住该块并在之后使用它。我需要将块记忆为一个全局变量或一个类。在类中我不允许声明一个auto as instance变量。有没有办法?

1 个答案:

答案 0 :(得分:2)

您的问题中有两个问题:

  1. 我可以提前声明自动变量(初始化之前)
  2. 如何存储lambda函数
  3. 第一个问题的答案是“不”:自动变量的声明必须伴随初始化。你不能拥有:

    auto x;  // error
    x = 42;
    

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

    auto x = 42;
    

    有效,因为42是int,所以编译器为x

    分配一个整数

    对于第二个问题,请使用std :: function。它尽可能优化。有一些细节需要考虑。具体来说:是代码块&lt; code&gt;指的是lambda函数范围之外的变量。如果是,您是否希望它通过值或引用引用这些变量。所有这些变量都必须存储在某处(a.k.a. capture),这就是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> }
    

    最后,正如其中一位评论者指出的那样,如果你没有捕获,最好的办法就是简单地将&lt; code&gt;代码转换为函数,稍后再调用它。