Есть ли способ сохранить автоматическую переменную и использовать ее впоследствии?

Я пытаюсь сохранить блок кода и использовать его впоследствии. Поэтому я смогу объявить автоматическую переменную как глобальную, назначить ее и затем вызвать блок:

// In the header
auto __myblock; // error

Затем:

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

Но проблема в том, что я получаю синтаксическую ошибку: кажется, что я должен инициализировать переменную в тот момент, когда я объявляю ее, поэтому я не могу запомнить этот блок и использовать его впоследствии. Мне нужно запомнить блок как глобальную переменную или внутри класса. Также внутри класса мне не разрешено объявлять auto как переменную экземпляра. Есть ли способ?

0

Решение

В вашем вопросе есть два вопроса:

  1. Могу ли я объявить авто переменную раньше времени (до инициализации)
  2. Как хранить лямбда-функции

Ответ на первый вопрос — «нет»: объявление авто переменных должно сопровождаться инициализацией. Вы не можете иметь:

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> }

Наконец, как отметил один из комментаторов, если у вас нет захвата, лучше всего просто выделить <код> код в функцию и просто вызвать ее позже.

2

Другие решения

Других решений пока нет …