All streams
Search
Write a publication
Pull to refresh
0
0
Роман @compmaniak

Пользователь

Send message
Хорошая читаемость — субъективный критерий. Если не нравится/не подходит стандартное решение и хочется эксплуатировать потокобезопасную инициализацию, то можно это реализовать гораздо проще на современном С++ и без привлечения препроцессора. Например:
#include <iostream>

template<typename T>
struct OnceRunner
{
    OnceRunner(T&& func)
    {
        func();
    }
};

template<typename T>
OnceRunner<T> const& RunOnce(T&& func)
{
    static OnceRunner<T> const runner(std::move(func));
    return runner;
};

void Foo()
{
    std::cout << "Foo call" << std::endl;
    RunOnce([]()
    {
        std::cout << "Run me once" << std::endl;
    });
}

int main(int argc, char* argv[])
{
    Foo();
    Foo();
    Foo();
    return 0;
}

Результат:
Foo call
Run me once
Foo call
Foo call

При таком подходе можно вообще не задумываться об ограничениях на количество/состав операторов в коде инициализатора или о переопределнии неявных локальных переменных.

Information

Rating
Does not participate
Location
Ярославская обл., Россия
Date of birth
Registered
Activity