Daily bit(e) of C++ #138, Самый простой одноэлементный паттерн, также известный как синглтон Скотта Мейера.

По возможности следует избегать синглтонов, поскольку они создают препятствие для тестирования. Однако иногда глобальное состояние может быть наименее плохим выбором.

Если вам нужен синглтон, используйте простую функцию получения, которая возвращает ссылку на локальную статическую переменную.

Статические переменные блочной области инициализируются потокобезопасным и безопасным способом.

struct GlobalData {
    int state;
private:
    // Optional: prevent GlobalData to be constructible
    // outside of get_global_data()
    GlobalData(int state) : state(state) {}
    friend GlobalData& get_global_data();
};

// a.k.a. Scott Meyer's singleton
GlobalData& get_global_data() {
    // Static block-scope variables have static storage duration
    // and are initialized on the first time the control passes
    // through the declaration in a thread-safe manner.
    static GlobalData storage{42};
    return storage;

    // Note: if the initialization throws, it will be re-attempted 
    // on the next pass-through.
}

// get_global_data().state == 42

Откройте пример в Compiler Explorer.