0

たとえば、10個のテンプレート関数があるとします。

command1<T>(const std::string&) 
command10<T>(const std::string&, int timeInSeconds)

コードのある時点で、特定のコマンドを実行したいことを確認します。次に、このコマンドに関連付けられているタイプに関する情報を(実行時に)要求します。これは、列挙型を介して返されます。したがって、実行したいことを確認command2し、列挙型に。が含まれていることを確認しますSTRING。したがって、私は電話したいと思います:

command2<std::string>(id, param1, param2); 

このマッピングを行うための良いアプローチとして何をお勧めしますか?

列挙型にはINT、BOOLを含めることができます。DOUBLEまたはSTRING。特定のコマンドに渡される引数は、列挙型の値に依存しません。

例:

これがもう少しよく説明する例です:

私のプログラムがコマンドラインから「command4a」を受け取ったとしましょう。この入力を解析し、command4を呼び出す必要があることを確認します。次に、「a」に関連付けられているタイプを検索し、この場合はを取得しINTます。私は今電話する必要がありますcommand4<int>("a");

4

1 に答える 1

2

ここswitchでステートメントが機能します。

switch (type) {
    case INT: commmand4<int>(id); break;
    ...
}

実際にメソッドを呼び出す方法によっては、引数をテンプレート化することをお勧めします。

template<typename F, typename... Args> void call_function(Type type, Args... &&args) {
    switch (type) {
        case INT: return F::command<int>(std::forward(args)...);
        ...
    }
}

関数テンプレートを関数に渡すことはできないため、関数テンプレートをクラス内にまとめる必要があることに注意してください。

struct Command1 {
    template<typename T> static void command(const std::string&);
};
...

call_function<Command1>(INT, "a");
于 2012-09-18T11:54:39.690 に答える