0

コード内のさまざまな場所で定義されているいくつかの実装を持つ C++ の純粋な仮想基本クラス/インターフェイスがあり、他の実装は後で追加される可能性があります。使用可能な実装を登録し、(構成ファイル、ユーザー入力などから) 使用するインターフェイスの実装を読み取り、その実装のインスタンスを構築する方法が必要です。

一般的な方法でこれを行うにはどうすればよいですか (つまり、各実装を明示的にリストする switch/ case ステートメントではなく、テーブル駆動)。タイプを示す実行時の値から、インスタンス化できるコンパイル時のタイプに移行する方法がわかりません。

ブーストにこんなのありますか?

4

1 に答える 1

1

標準的なアプローチには、ユーザーが指定した識別子に基づいて具象型をインスタンス化する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();

    ...
} 
于 2012-11-01T15:39:25.703 に答える