我正在考虑如何创建从模板基类派生的所有类的列表。
首先我想要一个模板基类:
template <typename T>
class Base
{
public:
Base() {};
virtual ~Base() {};
};
Run Code Online (Sandbox Code Playgroud)
以及一个继承自模板基类的类:
class Foo : public Base<Foo >
{
public:
Foo () {};
virtual ~Foo () {};
};
Run Code Online (Sandbox Code Playgroud)
可能还有任意数量的其他子类,例如Foo. 结果应该看起来像这样:
std::vector<std::string> allTemplates = Base<Base>::getAllTemplateClasses();
Run Code Online (Sandbox Code Playgroud)
我的问题是是否可以在编译时创建所有子类的列表?魔术应该发生在基础班上,或者在儿童班上花费很少的努力。
我之前一直在思考不同的方向。首先我认为可以使用constexpr. 就像每个子类都需要一个带有签名的静态函数:
constexpr static std::string name() { "Foo";}
Run Code Online (Sandbox Code Playgroud)
或者认为也许可以使用元编程并创建一个编译时列表,例如使用 Template-Meta 的编译时数据结构示例。这里的问题是我不知道模板创建的头部。
接下来我正在考虑使用宏并构建一个枚举结构,就像这样枚举结构扩展一样。所以我找不到解决这个问题的办法,我想问你是否有可能?
编辑:
说清楚:我想要一个子对象的列表,而不需要创建它们。
我有方便的对象工厂模板,它按类型ID名称创建对象.实现非常明显:ObjectFactory包含从std::string对象创建者函数的映射.然后,所有要创建的对象都应在此工厂中注册.
我使用以下宏来做到这一点:
#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName
Run Code Online (Sandbox Code Playgroud)
这里RegisterClass是
template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};
Run Code Online (Sandbox Code Playgroud)
用法
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 */ }
}
Run Code Online (Sandbox Code Playgroud)
类在工厂中同时定义和注册.
问题是regInFactory...静态对象是在.h文件中定义的,因此它们将被添加到每个翻译单元中.同一个对象创建者将被多次注册,更重要的是,会有很多具有静态存储持续时间的冗余对象. …