C++ 有没有办法保存自动变量并在以后使用?
我正在尝试保存一个代码块并在以后使用它。因此,我将能够将自动变量声明为全局变量,分配它,然后调用该块:C++ 有没有办法保存自动变量并在以后使用?,c++,c++11,auto,C++,C++11,Auto,我正在尝试保存一个代码块并在以后使用它。因此,我将能够将自动变量声明为全局变量,分配它,然后调用该块: // In the header auto __myblock; // error 然后: __myblock=[]() { <code> }; <other code> __myblock(); \uuu myblock=[]() { }; __myblock(); 但问题是我得到了一个语法错误:似乎我必须在声明变量时初始化它,因此,我无法记住该块并在
// In the header
auto __myblock; // error
然后:
__myblock=[]()
{
<code>
};
<other code>
__myblock();
\uuu myblock=[]()
{
};
__myblock();
但问题是我得到了一个语法错误:似乎我必须在声明变量时初始化它,因此,我无法记住该块并在以后使用它。我需要将该块作为全局变量或在类中记住。在类中,我也不允许将auto声明为实例变量。有办法吗?在您的问题中有两个问题:
我是否可以提前声明自动变量(在初始化之前)
如何存储lambda函数
第一个问题的答案是“否”:自动变量的声明必须与初始化一起提供。你不能有:
auto x; // error
x = 42;
因为编译器在声明时不知道x应该是什么。另一方面:
auto x = 42;
是有效的,因为42是int,所以编译器为x分配一个整数
对于第二个问题,使用std::function。它尽可能地优化。有一些细节需要考虑。具体来说:是代码块指lambda函数范围之外的变量。如果是,您希望它通过值还是通过引用引用这些变量。所有这些变量都必须存储在某个地方(也称为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
最后,正如一位评论者所指出的,如果您没有捕获,最好的方法是简单地将代码分解成一个函数,然后简单地调用它。不要在名称中使用双下划线。任何与这些相关的内容都将保留给实现。不管怎样,它总是一个具有相同函数签名的lambda吗?如果是这样,只需将其声明为正确的std::function
类型。auto
变量必须在创建时初始化。你不能像以前那样使用它。@chris:这是个好主意,它可能会满足OP的需要。但需要注意的是,这不是同一回事,std::function
的性能特性比裸lambda更差。@BenjaminLindley,没错,我通常从不担心性能,除非有充分的理由提到它。根据代码的不同,这可能根本没有什么区别。如果lambda没有捕获,为什么不使用常规函数呢?捕获代码在这里有点奇怪[x,y]{}
不需要将整数作为参数,它可以在没有参数的情况下访问它们。@Xeo,你是对的。在lambda中不需要形式参数(事实上,没有参数的形式就是规范形式)。我添加了它的可读性,但肯定可以删除。
// no capture:
_myblock = []() { <code> }
// with capture:
_myblock = [x,y]( int x, int y) { <code> }