Реализация синглтона через unique_ptr

268
05 марта 2018, 00:50

Встретил несколько раз в проектном коде реализации синглтонов подобным образом:

class singleton {
public:
    static singleton& get() 
    {
        std::call_once(m_flag, []()
        {
            m_instance.reset(new singleton());
        });
        return *m_instance.get();
    }
    virtual ~singleton() {}
private:
    static std::unique_ptr<singleton> m_instance;
    static std::once_flag m_flag;
    singleton() {}
    singleton(const singleton& other) = delete;
    singleton& operator=(const singleton& rhs) = delete;
};
std::unique_ptr<singleton>  singleton::m_instance = nullptr;
std::once_flag              singleton::m_flag;

Вопрос мой относительно использования std::unique_ptr в этой реализации. Зачем могло потребоваться это использовать? Чтобы явно вызывать деструктор во время работы? А если потребуется экземпляр синглтона заново создать, то придется заново конструировать его, а это может быть недешево. Почему бы просто не использовать реализацию Майерса типа:

class Singleton
{
  public:
    static Singleton& Instance()
    {
        // согласно стандарту, этот код lazy-init и потокобезопасный
        static Singleton s;
        return s;
    }
  private:
    Singleton() { ... }
    ~Singleton() { ... }
    Singleton(Singleton const&);
    Singleton& operator= (Singleton const&);
};

Не вижу никаких причин, кроме как любви к ->

READ ALSO
Как убрать множество массивов в один массив, чтоб передать в функцию?

Как убрать множество массивов в один массив, чтоб передать в функцию?

Есть массивы, динамические двумерные, которые формируются в результате математических операцийМне надо несколько массивов объединить в один...

319
c++ работа с файлами

c++ работа с файлами

Когда вывожу в файл данные (язык - c++), через fstream, они появляется в нём только после того, как я этот файл закрою (то есть, если ofstream file, то информация...

287
Массив с множеством key+value

Массив с множеством key+value

Мне нужен вектор, в который будут передаваться массивы с множеством ключей, это можно сделать через структуру:

300