В дополнение к ответу @ Basile вы можете использовать лямбду для инкапсуляции статической переменной следующим образом:
if ([] {
static bool is_first_time = true;
auto was_first_time = is_first_time;
is_first_time = false;
return was_first_time; } ())
{
// do the initialization part
}
Это упрощает преобразование в макрос общего назначения:
#define FIRST_TIME_HERE ([] { \
static bool is_first_time = true; \
auto was_first_time = is_first_time; \
is_first_time = false; \
return was_first_time; } ())
Который можно разместить где угодно по требованию :
if (FIRST_TIME_HERE) {
// do the initialization part
}
И для хорошей меры, атомика сокращает выражение и делает его поточно-ориентированным:
#include <atomic>
#define FIRST_TIME_HERE ([] { \
static std::atomic<bool> first_time(true); \
return first_time.exchange(false); } ())