我是模板新手,发现这件事相当混乱。我有一个模板类,用作将实体映射到字符串的表,我的类代码是这样的
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 retrieveEntity(wstring info)
我希望这个类是一种单例,在它被初始化的地方构造一次,并在任何地方调用静态函数。地图在构建后是不可变的。wstring
传递给模板,模板将返回与该wstring
标签关联的相应类。我只需要一种快速的检索方式,考虑到桌子很大的情况,为了方便,我只显示了两个项目。
PS 我知道我也可以使用 if 或 switch 语句返回相应的类型,但这既长又麻烦,并且违背了使用地图的目的