我试图保存一段代码并在之后使用它。所以我将能够将auto变量声明为全局,分配它然后调用块:
// In the header
auto __myblock; // error
然后:
__myblock=[]()
{
<code>
};
<other code>
__myblock();
但问题是我遇到了语法错误:似乎我必须在声明它的那一刻初始化变量,因此我无法记住该块并在之后使用它。我需要将块记忆为一个全局变量或一个类。在类中我不允许声明一个auto as instance变量。有没有办法?
答案 0 :(得分:2)
您的问题中有两个问题:
第一个问题的答案是“不”:自动变量的声明必须伴随初始化。你不能拥有:
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;代码转换为函数,稍后再调用它。