初始化一个 C++ 11 风格的单例

Initializing a c++ 11 style singleton

假设我有一个单身人士 class App 我获得了其中的实例 via:

App& App::get()
{
    static App instance;
    return instance;
}

根据我的研究,当需要单例时,这显然是获取实例的最佳方式。但是假设我需要在初始实例化期间传递一次值,例如:

void App::init(bool someValue)
{
    static App instance(someValue);
}

我在这个概念上苦苦挣扎的地方是,我如何才能通过 get() 方法获得该实例,而不必每次都传递 someValue

过去在 init() 中,我会简单地使用构造函数创建一个 App 实例,传递初始化值并将该实例作为静态成员保存到 App class,然后 get() 会 return 那个单一的实例。我似乎无法弄清楚如何将这种行为转化为这种新范式。实现此目标的最佳方法是什么?

嗯,你可以有一个静态指针指向 init 中的本地静态实例:

// App.hpp
#include <cassert>

class App {
public:
    static void init(bool const b) noexcept {
        static App ap{b};
        _inst = &ap;
    }

    static App& get() noexcept {
        assert(_inst);
        return *_inst;
    }
private:
    App(bool const b)
        : _b{ b }
    {}

    bool _b;
    static App* _inst;
};

// App.cpp

App* App::_inst = nullptr;

// main.cpp

int main() {
    App::init(true);
    auto& ap = App::get(); 
}