我有方便的对象工厂模板,它通过类型 ID 名称创建对象。实现非常明显:ObjectFactory
包含从std::string
到对象创建函数的映射。然后所有要创建的对象都应该在这个工厂中注册。
我使用以下宏来做到这一点:
#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName
RegisterClass
在哪里
template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};
用法
class IFoo
{
public:
virtual Do() = 0;
virtual ~IFoo() {}
}
REGISTER_CLASS(Foo, IFoo)
{
virtual Do() { /* do something */ }
}
REGISTER_CLASS(Bar, IFoo)
{
virtual Do() { /* do something else */ }
}
类在工厂中同时定义和注册。
问题是regInFactory...
静态对象是在 .h 文件中定义的,因此它们将被添加到每个翻译单元中。同一个对象创建者会被多次注册,更重要的是,会有很多冗余的对象,存储时长是静态的。
有没有办法进行这种优雅的注册(不要复制/粘贴类和接口名称),但不要在全球范围内传播冗余的静态对象?
如果一个好的解决方案需要一些 VC++ 特定的扩展(不符合 C++ 标准),我会同意的。