標準的なアプローチには、ユーザーが指定した識別子に基づいて具象型をインスタンス化するfactoryと呼ばれる作成 パターンが含まれます。
Boost を既に使用している場合は、Boost.Functional/Factoryをご覧ください。ただし、テーブルベースのディスパッチ メカニズムを自分で構築することはそれほど難しくありません。これは、ランタイム ポリモーフィズムで Boost バージョンを使用する方法です。
struct abstract
{
virtual ~abstract() = default;
virtual void f() = 0;
};
struct concrete1 : abstract
{
virutal void f() override;
};
struct concrete2 : abstract
{
virutal void f() override;
};
typedef boost::function<abstract*()> abstract_factory;
int main()
{
// Here, each factory refers to a function, although sometimes
// people use the term factory to mean the dispatch table itself.
std::map<std::string, abstract_factory> factories;
factories["foo"] = boost::factory<concrete1*>();
factories["bar"] = boost::factory<concrete2*>();
// Create a new concrete object.
auto foo = factories["foo"]();
// vtable dispatch "concrete1".
foo->f();
...
}