有没有人知道一种方法,使派生类自动实例化一个模板类型的静态变量(这要么不需要派生类的编写器,或强迫他调用这个静态方法,以使派生类定义有效).
这可能是不可能理解的,我会尝试更好地定义它.
基本上我有一个全局工厂类,带有一个名为registerType的模板化函数.对于从Entity派生的每个类,我需要使用派生类型的模板参数调用此函数.目前,我必须在某个init函数中手动执行此操作,这会导致对此函数的大量调用,这违反了我的模板原则.
所以我有这个:
class Factory
{
template <typename EntityType>
registerEntityType();
};
void someInitFunction()
{
/// All of these are derived from Entity
gFactory.registerEntityType<EntityType1>();
gFactory.registerEntityType<EntityType2>();
gFactory.registerEntityType<EntityType3>();
/// and so on
}
Run Code Online (Sandbox Code Playgroud)
而我宁愿这样:
class Factory
{
template <typename EntityType>
registerEntityType();
};
class Entity // Abstract
{
/// This function should be called automatically with the derived
/// type as a parameter
SomeStaticConstructor<MDerivedType>()
{
gFactory.registerEntityType<MDerivedType>();
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:这是不起作用的静态重复模板代码:
这是我的基类,以及用于自动注册东西的类
template <typename DerivedType>
class Registrar
{
public:
Registrar();
void check();
};
template <typename …Run Code Online (Sandbox Code Playgroud) C++中的自动类注册是一项常见任务,这是StackOverflow上常见的问题:
基本目标是自动向某些注册表或工厂注册类,以便以后可以对每个类进行一些工作.
这是一种成熟的技术,由(例如)Google Test(http://code.google.com/p/googletest)等库使用,它自动注册Test类的子类,以便每个测试都可以自动实例化并在测试执行期间运行.
注册可以通过实例化其构造函数进行注册的静态注册器类,或者通过巧妙地使用CRTP并将注册代码放在基类构造函数中,或者您喜欢的任何内容(上面的链接提供了几种不同的可能技术)来完成.
但是,当我实施任何这些技术时,我发现它们的扩展性非常差.如果我在Google Test中有10,000个TEST宏调用,则编译和链接会停止(MSVC 2010)并且二进制大小会爆炸.如果我以另一种方式实现,使用10,000个子类与静态注册器,我看到相同的行为.
例如,考虑简化的例子:
#include <iostream>
#include <string>
class Base {
public:
Base( const std::string& Name_ ) : Name( Name_ ) { ; }
~Base() { ; }
virtual std::string GetName() const { return Name; }
virtual void DoSomething() = 0;
private:
std::string Name;
};
class Registry {
public:
static Registry& GetInstance() {
static Registry* Instance = new Registry();
return *Instance;
}
void Register( const Base* b ) …Run Code Online (Sandbox Code Playgroud)