我以前做过类似的事情。构建字符串(类型)/函数指针(工厂)对的 unordered_map。每一个都指向一个创建该类型实例的静态函数。
这仍然需要您拥有那些小存根工厂函数,通常它们是创建该类型的单行代码。宏可用于生成工厂方法。
typedef std::unordered_map<std::string, Superclass *(*)()> TypeDirectory;
TypeDirectory types;
#define NAMEFACTORY(name_) static Superclass *Create() { return new name_; }
class Hello : public Superclass
{
...
NAMEFACTORY(Hello)
};
static void RegisterFactoryNames()
{
types.emplace_back("Hello", &Hello::Create);
...
}
static Superclass *MakeInstance(std::string &name)
{
auto i = types.find(name);
return i != types.end() ? types->second() : 0;
}
只有您会知道名称工厂数据所属的位置,在我的示例中我没有将其“放入”任何内容中。
注意:如果您使用的是 MSVC 10 或更低版本(2010 或更低版本),请使用types.push_back(TypeDirectory::value_type("Hello", &Hello::Create));
因为 emplace_back 在这些版本中的实现完全不正确。