Я пытаюсь сохранить блок кода и использовать его впоследствии. Поэтому я смогу объявить автоматическую переменную как глобальную, назначить ее и затем вызвать блок:
// In the header
auto __myblock; // error
Затем:
__myblock=[]()
{
<code>
};
<other code>
__myblock();
Но проблема в том, что я получаю синтаксическую ошибку: кажется, что я должен инициализировать переменную в тот момент, когда я объявляю ее, поэтому я не могу запомнить этот блок и использовать его впоследствии. Мне нужно запомнить блок как глобальную переменную или внутри класса. Также внутри класса мне не разрешено объявлять auto как переменную экземпляра. Есть ли способ?
В вашем вопросе есть два вопроса:
Ответ на первый вопрос — «нет»: объявление авто переменных должно сопровождаться инициализацией. Вы не можете иметь:
auto x; // error
x = 42;
сам по себе, потому что компилятор не будет знать при объявлении, каким должен быть x. С другой стороны:
auto x = 42;
допустимо, потому что 42 — это int, поэтому компилятор выделяет целое число для x
Для второго вопроса используйте std :: function. Он оптимизирован настолько, насколько это возможно. Есть некоторые детали для рассмотрения. В частности: это блок кода <код> относится к переменным вне области лямбда-функции. Если это так, вы хотите, чтобы он ссылался на эти переменные по значению или по ссылке. Все эти переменные должны где-то храниться (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> }
Наконец, как отметил один из комментаторов, если у вас нет захвата, лучше всего просто выделить <код> код в функцию и просто вызвать ее позже.
Других решений пока нет …