素敵なC++11可変個引数テンプレートを使用してオブジェクトを作成する方法に関するコード(K-balloの回答に見られるように)に加えて、この回答は、プロジェクト内のクラスのセットを処理する方法を示しています。この方法は大きなハックであり、何をしているのかがわかっている場合にのみお勧めします。ただし、プロジェクトに新しいクラスを追加する場合は、すべてのクラスを一覧表示する1つのファイルに追加するだけでよいため、プロジェクトが巨大になった場合は、概要を維持するのに役立ちます。
このアプローチは、クラスを複数回リストする必要がある場合std::string className()
、たとえば、C ++実行時型情報を使用せずにクラスの名前を返すなど、関数も必要な場合にのみ使用してください。プロジェクト内のすべてのクラスをリストする必要があるこのような関数はすべて、以下と同様の方法で実装できます。
classes.h
/* For every class in your project which should be creatable through your
* factory, add a line here. */
CLASS(Foo)
CLASS(Bar)
CLASS(Baz)
factory.cpp
template< typename ...Args >
std::shared_ptr<void> createObject( std::string const& name, Args&& ...args )
{
// Define what code to insert for every class:
#define CLASS(T) \
else if(name == #T) \
return std::make_shared<T>(std::forward(args)...);
// List all cases:
if(0) /*do nothing*/; // <-- needed because the macro uses else if
#include "classes.h"
#undef CLASS
return nullptr;
}