私はテンプレートに不慣れで、これはかなり紛らわしいと思います。エンティティを文字列にマッピングするためのテーブルとして機能するテンプレートクラスがあります。クラスのコードは次のようになります。
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ステートメントを使用して対応する型を返すこともできることは知っていますが、それは長くて面倒であり、マップを使用する目的に反します。