Как закодировать Jon Skeet Singleton в С++?

На Jon сайт у него есть такой элегантно оформленный синглтон в С#, который выглядит так:

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

Мне было интересно, как закодировать эквивалент в С++? У меня есть это, но я не уверен, имеет ли он на самом деле те же функции, что и у Джона. (Кстати, это всего лишь пятничное упражнение, не требуемое для чего-то конкретного).

class Nested;

class Singleton
{
public:
  Singleton() {;}
  static Singleton& Instance() { return Nested::instance(); }

  class Nested
  { 
  public:
    Nested() {;}
    static Singleton& instance() { static Singleton inst; return inst; }
  };
};

...


Singleton S = Singleton::Instance();

Ответы

Ответ 1

Этот метод был введен исследователем Университета Мэриленда по компьютерным наукам Биллом Пью и долгое время использовался в Java-кругах. Я думаю, что я вижу здесь вариант С# оригинальной реализации Java Билла. Это не имеет смысла в контексте С++, поскольку текущий стандарт С++ является агностиком на parallelism. Вся идея основана на языковой гарантии, что внутренний класс будет загружен только в случае первого использования в потокобезопасном режиме. Это не относится к С++. (Также см. Эту запись Wikipedia)

Ответ 3

Насколько мне известно, наследуемое поведение Singleton невозможно в С++ или Java (или, по крайней мере, это не было в более ранних версиях JDK). Это особый трюк на С#. Ваши подклассы должны будут явно реализовать протокол.