一种方法是使用模板函数来实例化以下的子类CBaseTheoryEnt:
template<typename T>
CBaseTheoryEnt* instantiator() {
return new T;
}
Run Code Online (Sandbox Code Playgroud)
然后hash_map为每个派生一个类的函数或数组,CBaseTheoryEnt并使该类的密钥与它的实例化器相关联.然后,当您索引数组或映射时,您将获得一个函数,该函数在调用时将返回指向相应类的实例的指针.
例如,如果您有A,B和C类,并且A的ID为0,则B为1,C为2,您将拥有:
typedef CBaseTheoryEnt* (*instantiator_ptr)();
instantiator_ptr classes[] = {
&instantiator<A>,
&instantiator<B>,
&instantiator<C>
};
Run Code Online (Sandbox Code Playgroud)
然后就像使用它一样
int idx = get_class_id();
CBaseTheoryEnt* inst = classes[idx]();
Run Code Online (Sandbox Code Playgroud)