Встретил несколько раз в проектном коде реализации синглтонов подобным образом:
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&);
};
Не вижу никаких причин, кроме как любви к ->
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости