Одиночный дизайн шаблона проблема - PullRequest
1 голос
/ 20 октября 2011

В настоящее время я использую следующий простой синглтон-класс:

template<class T>
class singleton
    : boost::noncopyable
{
public:
    static T& get_instance()
        {
            assert(sm_instance != nullptr);
            return *static_cast<T*>(sm_instance);
        }

protected:
    singleton()
        {
            assert(sm_instance == nullptr);
            sm_instance = this;
        }
    virtual ~singleton()
        {
            assert(sm_instance != nullptr);
            sm_instance = nullptr;
        }

private:
    static singleton<T>* sm_instance;
};

template<class T> singleton<T>* singleton<T>::sm_instance = nullptr;


class example_one
    : public singleton<example_one>
{
    static example_one instance;
};

example_one example_one::instance;


class example_two
    : singleton<example_two>
{
    static example_two instance;
};

example_two example_two::instance;


// Usage:
example_one& x = example_one::get_instance();
example_two& y = example_two::get_instance();   // not accessible because 'example_two' uses 'private' to inherit from 'singleton<T>'

Однако я бы хотел кое-что настроить. Мне не нравится, что get_instance() наследуется производному классу.

Я хотел бы сделать что-то вроде этого (нерабочий код):

template<class T>
T& get_singleton();

template<class T>
class singleton
{
    friend T& get_singleton()
        {
            assert(sm_instance != nullptr);
            return *static_cast<T*>(sm_instance);
        }   
}

// Usage:
example_two& x = get_singleton<example_two>();

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

В решении, популяризированном Андреем Александреску, используется другая методика, которая имеет несколько преимуществ по сравнению с этой (одна из них - это настройка, которую вы хотите сделать). Он доступен по адресу http://loki -lib.cvs.sourceforge.net / loki-lib / loki / include / loki / Singleton.h? View = markup , но вы, вероятно, хотите загрузить всю библиотеку (loki ), или немного почистите, если вам не нужны дополнения. Интерфейс становится:

typedef Loki::SingletonHolder&lt SomeType > SomeTypeSingleton;
SomeTypeSingleton::Instance(); // Access the single instance
0 голосов
/ 20 октября 2011

Если вы собираетесь использовать функцию шаблона, зачем использовать базовый класс:

template<typename T>
T& getInstance()
{
     static T  instance;
     return instance;
}

class example_one: boost::noncopyable
{
       example_one() {}  // Note private construtor
       friend example_one& getInstance<example_one>();
};

class example_two: boost::noncopyable
{
       example_two() {}
       friend example_two& getInstance<example_two>();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...