私は現在、次のような単純なシングルトンクラスを使用しています:シングルトンのテンプレートデザインの問題
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>();
あなたがシングルトンを使用していない、どのような方法でそれを避けることができれば - http://stackoverflow.com/questions/1392315/problems-with-singleton-pattern –
あなたのコードがない可能多くのセンス。最初の例では、そのインスタンスフィールドがnullかどうか、コンストラクタで(なぜ?)、そしてデストラクタがさらに悪いかどうかを調べます。デストラクタはsm_instanceを削除するか、デストラクタをまったく必要としません。また、デストラクタの内部にinstacneフィールドをnullに設定することは、全く無意味です。 –
@ AngelO'Sphere - もう一度コードを読んで考えてください。 – 0xbadf00d