Безопасно ли использовать новый поток в одноэлементной реализации Мейера? - PullRequest
1 голос
/ 01 марта 2020

Мы знаем, что Meyers Singleton является поточно-ориентированным с c ++ 11.

Я использую этот шаблон синглтона.

struct singleton_t
{

  static
  singleton_t &
  instance()
  {
    static singleton_t s;
    return s;
  } // instance

  singleton_t(const singleton_t &) = delete;
  singleton_t & operator = (const singleton_t &) = delete;

private:

  singleton_t() {}
  ~singleton_t() {}

}; // struct singleton_t

singleton_t не является указателем или ссылкой, поэтому полиморфизм не применяется.

Теперь я хочу сделать это примерно так:

struct singleton_t
{

  static
  singleton_t *
  instance(singleton_t* p = nullptr)
  {
    static singleton_t *s = nullptr == p ? new singleton_t : p;
    return s;
  } // instance

  singleton_t(const singleton_t &) = delete;
  singleton_t & operator = (const singleton_t &) = delete;

private:

  singleton_t() {}
  ~singleton_t() {}

}; // struct singleton_t

Таким образом, я singleton_t могу указать на экземпляр своего подкласса, чтобы полиморфизм мог быть достигнут. Или есть лучший подход?

...