假设我有100个从基类派生的类。每个派生类在编译时都有一个介于[0,100)之间的唯一标识符。
我有一个函数,它需要接受一个ID并返回具有该ID的新分配实例化的派生类。
显然,为每个ID设置一个巨大的switch case并不是一个好的解决方案。我能想到的最佳解决方案示例如下,但我感觉有一种方法可以避免vtable引入的开销。
我在想,是否有其他方法可以不需要占用这么多空间?关于此问题,您认为我是在胡闹吗?
我有一个函数,它需要接受一个ID并返回具有该ID的新分配实例化的派生类。
Base* CreateDerived(uint32_t id) {
return new Derived...();
}
显然,为每个ID设置一个巨大的switch case并不是一个好的解决方案。我能想到的最佳解决方案示例如下,但我感觉有一种方法可以避免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;
};
我在想,是否有其他方法可以不需要占用这么多空间?关于此问题,您认为我是在胡闹吗?