Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

[C\C++] Конструкция call once

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
Больше как памятка для себя.....

Как понятно из названия речь пойдет о "единичном вызове", своеобразном Singlton участа кода.
Почти аналогично конструкции:
Код:
Expand Collapse Copy
static bool call_once  = true;
if(call_once)
{
//todo
call_once  = false;
}

Служит для инициализации и разового выполнения кода, когда это нужно. Недостаток метода указанного выше: для каждого единичного вызова требуется объявленная переменная + контроль основанный на ней.


Более современный и "элегантный" способ с использованием современных стандартов:
Код:
Expand Collapse Copy
#define DO_ONCE(todo) do { \
   static std::once_flag _flag ;\
   std::call_once(_flag, todo); \
} while (false)


Что в итоге имеем:
Удобный макрос в одну стоку
Благодаря Лямбда-функции возможность вызова функций со всеми ее "прикрасами"


пример:

Код:
Expand Collapse Copy
void Test_1(){
    std::cout << "call" << std::endl;
}
DO_ONCE(Test_1);
Код:
Expand Collapse Copy
void Test_2(int a0){
    DO_ONCE([a0] {
        std::cout << "call: " << a0 << std::endl;
    });
}

Код:
Expand Collapse Copy
DO_ONCE([&]()
        {
            std::cout << "call" << std::endl;
        });

Применений много......
 
Форматирование (BB-код):
Expand Collapse Copy
void verycool()
{
    printf("[%s] hello\n", __FUNCTION__);
    int asd = 13;
    printf("[%s] asd -> %i\n", __FUNCTION__, asd);
    asd += 3;
    printf("[%s] asd again -> %i\n", __FUNCTION__, asd);
}

static auto once = (verycool(), false);

Форматирование (BB-код):
Expand Collapse Copy
static auto once = []()
    {
        printf("this text is going to show up only once, don't miss it!\n%s\n", __DATE__);
        return true;
    }();

big edit: макрос на это не сильно то и нужен
 
Последнее редактирование:
Назад
Сверху Снизу