假设我有 100 个从 Base 派生的类。这些派生类中的每一个都有一个介于 [0,100) 之间的唯一标识符,在编译时已知。
我有一个函数,它需要一个 ID,并且需要返回一个新分配的具有该 ID 的派生类实例。
Base* CreateDerived(uint32_t id) {
return new Derived...();
}
为每个 ID 配备一个巨大的开关盒显然不是一个好的解决方案。下面提供了我能想到的最佳解决方案的一个示例,但我觉得有一种方法可以做到这一点,而无需 vtable 引入的开销。
struct RegisteredClass {
static RegisteredClass* ClassTable[MAX_DERIVED_CLASSES];
static Base* CreateDerived(int ID) { return ClassTable[ID]->Create(); }
RegisteredClass(int ID) { ClassTable[ID] = this; }
virtual Base* Create() = 0;
};
template<typename T, int ID>
struct Register : RegisteredClass {
Register() : RegisteredClass(ID) { }
virtual Base* Create() { return new T; }
};
class Derived34 : Base {
static Register<Derived34, 34> _register;
};
我是傻了,还是有另一种不需要太多空间的方法?