2

私のプログラムは構成ファイルから読み取り、毎回2つの特定のセクションの内容でいくつかのクラスをインスタンス化します。

クラスを初期化するVoiceには、次のように呼び出します。

initializeDomain ("voice", voice_config, voice_config_fields);

Voice次のように初期化する必要があります。

Voice voice ( config, config_fields );

そのために、次の関数をプログラムしました。

void initializeDomain (string dom, map<string, string> & config, map<string, string> & config_fields)
{
    if ( dom == "voice" ) {
        Voice voice ( config, config_fields );
        return voice;
    } else if ( dom == "account" ) {
        Account account (config, config_fields);
        return account;
    }
}

インスタンス化されるクラスに応じて戻り型が可変であるため、これは明らかに機能していません。そこで、このニーズに対応できるテンプレートを作成しようとしました。

template <typename T>
T initializeDomain (string dom, map<string, string> & config, map<string, string> & config_fields)
{
    if ( dom == "voice" ) {
        T instantiated ( config, config_fields );
    } else if ( dom == "account" ) {
        T instantiated ( config, config_fields );
    }
    return instantiated;                                                          }
}

しかし、それも機能しません。テンプレートでさまざまなクラスをインスタンス化するにはどうすればよいですか?

4

3 に答える 3

2

これは、ファクトリデザインパターンの古典的なアプリケーションのように見えます。インスタンスを動的に割り当て、[smart]ポインタで返します。

class Base {};
class DerivedOne : public Base {};
class DerivedTwo : public Base {};

typedef std::unique_ptr<Base> BasePtr;

BasePtr createFoo( /* arguments */ ) {
    BasePtr ptr; // initialized to nullptr
    if ( ... ) ptr.reset( new DerivedOne );
    else if ( ... ) ptr.reset( new DerivedTwo );
    else ...

    return ptr;
}

0を編集:

上記のセットアップの使用法は、ポリモーフィックタイプの場合です。つまり、さまざまな実装への共通のインターフェイスがある場合は、次のように、ポインターを介して仮想メソッドを呼び出します。

BasePtr base = createFoo( /* args */ );
base->callVirtualFunction( /* args */ );

あなたが話していることは少し奇妙です。C ++は強い型の言語です。つまり、無関係な型のインスタンスを同じ変数に格納することはできません。あなたが説明している単純なケースは次のようになります。

std::string value = getInputSomewhere();

if ( value == "voice" ) {
    Voice v( /* ctor args */ );
    // do your voice stuff here
} else if ( value == "account" ) {
    Account a( /* ctor args */ );
    // do your account stuff here
} else {
    // ...
}

ですから、あなたがそのテンプレートで何を達成しようとしているのか、私にはよくわかりません。

于 2012-11-07T17:56:44.313 に答える
2

あなたの質問を正しく理解できれば、ファクトリ パターンを使用してさまざまなタイプをフィードし、目的のインスタンスを返すことをお勧めします。それが役立つことを願っています。

于 2012-11-07T17:50:39.200 に答える
1

いくつかの仮定がなければ、質問に正確に適合しないかもしれませんが、私たちが続けなければならないことを考えると、工場のパターンに同意する必要があります.

頑張ってください。問題をどのように解決したか教えてください。

于 2012-11-14T21:30:43.157 に答える