Эксперт
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2014
- Сообщения
- 994
- Реакции
- 1,209
Больше как памятка для себя.....
Как понятно из названия речь пойдет о "единичном вызове", своеобразном Singlton участа кода.
Почти аналогично конструкции:
Служит для инициализации и разового выполнения кода, когда это нужно. Недостаток метода указанного выше: для каждого единичного вызова требуется объявленная переменная + контроль основанный на ней.
Более современный и "элегантный" способ с использованием современных стандартов:
Что в итоге имеем:
Удобный макрос в одну стоку
Благодаря Лямбда-функции возможность вызова функций со всеми ее "прикрасами"
пример:
Применений много......
Как понятно из названия речь пойдет о "единичном вызове", своеобразном Singlton участа кода.
Почти аналогично конструкции:
Код:
static bool call_once = true;
if(call_once)
{
//todo
call_once = false;
}
Служит для инициализации и разового выполнения кода, когда это нужно. Недостаток метода указанного выше: для каждого единичного вызова требуется объявленная переменная + контроль основанный на ней.
Более современный и "элегантный" способ с использованием современных стандартов:
Код:
#define DO_ONCE(todo) do { \
static std::once_flag _flag ;\
std::call_once(_flag, todo); \
} while (false)
Что в итоге имеем:
Удобный макрос в одну стоку
Благодаря Лямбда-функции возможность вызова функций со всеми ее "прикрасами"
пример:
Код:
void Test_1(){
std::cout << "call" << std::endl;
}
DO_ONCE(Test_1);
Код:
void Test_2(int a0){
DO_ONCE([a0] {
std::cout << "call: " << a0 << std::endl;
});
}
Код:
DO_ONCE([&]()
{
std::cout << "call" << std::endl;
});
Применений много......