0

私はテンプレートに不慣れで、これはかなり紛らわしいと思います。エンティティを文字列にマッピングするためのテーブルとして機能するテンプレートクラスがあります。クラスのコードは次のようになります。

template<class GENERIC_ENTITY> class EntityTable
{
private:

    map<wstring, GENERIC_ENTITY*> entityTable;

    // I want to put init in the default constructor so it gets initialized, but this doesn't compile 
    EntityTable<GENERIC_ENTITY>::EntityTable () {
        init();
    }

    void init()
    {
            entityTable[L"Entity1"] = new Entity1();
            entityTable[L"Entity2"] = new Entity2();
            entityTable[L"Entity3"] = new Entity3();
    }

public:

    // This function doesn't compile unless I remove the keyword static
    static template <class GENERIC_ENTITY> GENERIC_ENTITY retriveEntity(wstring identifier)
    {
        return entityTable[identifier];
    }
};

次に、このテンプレート関数を別のクラスで呼び出し、wstring識別子を使用して対応するエンティティを取得します。しかし、残念ながら、関数が静的であるかどうかに関係なく、クラスを作成することも、この関数を呼び出すこともできません。コンパイルすらしません。

関数が静的である場合、私は次のようなことをしEntityTable<T>::retriveEntity(wstring)たいと思いました。静的でない場合、最初にそれをインスタンス化したいのですが、テンプレートはクラスではないと聞いているので、テンプレートでそれを行う方法がわかりません。スタック上の実際のデータとして宣言したので、コンストラクターでnewを呼び出す必要はありません。コンストラクターがどのようなものかわかりませんが、それでもその関数にアクセスできません。

私は完全に混乱しています、誰かが私の頭を包むのを手伝ってくれますか?

編集:

ところで、別のクラスでこのテンプレートを宣言する方法は、template<class GENERIC_BOT> EntityTable entityTable;です。これが正しいかどうかわからない

すべてのEntityクラスは2つの共通クラスから継承されます(1つの間違いを修正しました)が、それらのクラスは抽象であるため、次のようなことを行うだけではインスタンス化できません。Entity retrieveEntity(wstring info)

このクラスを一種のシングルトンにし、初期化される場所で一度構築し、静的関数をeveywhereで呼び出します。マップは作成後は不変です。wstringテンプレートに渡され、テンプレートはそのwstringタグに関連付けられた対応するクラスを返します。テーブルが巨大な状況を考えると、検索のための迅速な方法が必要です。便宜上、2つのアイテムのみを示しました。

PS ifまたはswitchステートメントを使用して対応する型を返すこともできることは知っていますが、それは長くて面倒であり、マップを使用する目的に反します。

4

1 に答える 1

1

これは正常にコンパイルされるはずです:

template<class GENERIC_ENTITY> class EntityTable
{
private:

    map<wstring, GENERIC_ENTITY*> entityTable;

    EntityTable::EntityTable () {
        init();
    }

    void init()
    {
            entityTable[L"Entity1"] = new Entity1();
            entityTable[L"Entity2"] = new Entity2();
            entityTable[L"Entity3"] = new Entity3();
    }

public:

    GENERIC_ENTITY* retriveEntity(wstring identifier)
    {
        return entityTable[identifier];
    }
};

静的にしたい場合は、シングルトンパターンを適用するか、entityTableを静的と宣言します。ただし、その場合、コンストラクターは使用できず、init()も静的であり、コードのある時点で呼び出される必要があります。シングルトンは、init()が1回だけ呼び出されることを保証します。

于 2013-03-25T19:16:49.580 に答える