0

typedef以下のように、'dデータ型を参照する関数がいくつかあります。

typedef std::map<string, string> dict;

union ret_t{
    int i;
    long l;
    double d;
};

ret_t func1(char* bytes, dict &d){
    //blah blah
}
ret_t func2(char* bytes, dict &d){
    //blah blah 2
}

boost::function以下に定義されているように、ハンドラー関数のマップもあります。

std::map <int, boost::function< ret_t (char*, dict) > > handlers;

これを定義したのは、使用している100を超えるハンドラー関数を使用して、キーを読み取って呼び出しhandlers[key](bytes, d);、関数を実行するだけで、さまざまなデータ型に対して3つのif / elsesのみが必要になるようにしました(必要なデータ型を知っている私が入らない別の問題。それは質問とは無関係です)。これは期待どおりに機能します。

私の問題は、少数の関数がディクショナリを利用せず、ハンドラーの外部のコンテキストで役立つことです(たとえば、バイトのストリームを準備してそれをlong intに変換する関数)。dictが事前定義されていないコンテキストからこの関数を呼び出すには、使用されない役に立たないdictを作成する必要があります。

dict d;
func1(bytes, d);

または、関数を実行する必要があります。

//previous definition

ret_t func1(char* bytes){
    //same blah blah as before
}

NULLまたは空のdictなどのデフォルトの引数を使用して定義しようとすると、コンパイラエラーが発生します。

default argument for 'dict& d' has type 'dict {aka std::map<std::basic_string<char>, std::basic_string<char> >}'

参照の代わりにポインターを渡すためにコードを完全に書き直す必要なしに、私が望むことを行う方法はありますか?

4

1 に答える 1

0

辞書をとらない関数については、2つのバージョンを作成します。辞書をパラメータとして受け取らないものと、辞書を使わずに呼び出すだけのものを用意します。前者はすべての直接呼び出しに使用し、後者は辞書を使用する他の関数のようにディスパッチするために使用します。

于 2012-12-31T20:12:09.153 に答える