2

静的メンバー定義とともにテンプレート シングルトン クラスを実装しました。

template <typename T> class SingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = new T;
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T> T *SingletonT<T>::s_instance = 0;

正常にコンパイルされ、正常に動作します。今、 operator の代わりにカスタム関数を使用するシングルトンを作成しようとしていますnew:

template <typename T, T *(*f)()> class PolymorphSingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = f();
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T, T *(*f)()> T *PolymorphSingletonT<T, T *(*f)()>::s_instance = 0;

最後の行でコンパイルエラーが発生しますerror C2146: syntax error : missing ')' before identifier 'f'

MSVC2005 コンパイラを使用しています。

更新 今私はファンクターアプローチで終わった:

template <typename T, typename F> class PolymorphSingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = F::Create();
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T, typename F> T *PolymorphSingletonT<T, F>::s_instance = 0;

ただし、作成関数をファンクターでラップする必要があります。数行のコードを追加するだけで完全に機能しますが、ファンクターなしで取得することにまだ興味があります。

4

1 に答える 1

3

最後の行は次のようになります。

template <typename T, T *(*f)()> T *PolymorphSingletonT<T,f>::s_instance = 0;

型シグネチャを繰り返さず、指定した名前を使用してください。

于 2012-11-24T17:10:42.563 に答える