私は以前に似たようなことをしました。文字列(型)/関数ポインタ(ファクトリ)のペアの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の実装が完全に正しくないため、これらのバージョンを使用してください。