1

コード内で func() という 1 つの関数のみを呼び出したいとしますが、どの値を指定するかによって、その関数の正しい「バージョン」に直接移動しますか?

これは if-statements/switch-statements で実行できることはわかっていますが、渡された値を (非効率的に) チェックする必要があります。私はそれを行うためのプリコンパイルされた方法があることを望んでいましたか?

このようなことを効率的な方法で行うことは可能ですか?

func(3)

func() の 3 番目のバージョンを実行します。

func[1]{
    cout "One";
}

func[2]{
    cout "Two";
}

func[3]{
    cout "Three";
}
4

6 に答える 6

0

私たちはここで C++ を使用するタフな男性なので、mapfrom string(入力) to void *(すべての関数を表す) を使用します。この方法では、マップ内の呼び出し可能な関数の特定の順序を当てにする必要はありません。入力を数値に変換する必要もありません(入力がコ​​ンソールからのもので、文字列の場合)

#include <map>
#include <string>
#include <iostream>     // for cout

using namespace std;    // that's the way I like it

int main()
{
    map<string, void *> funcs;

    funcs["func1"] = (void *)func1;
    funcs["func2"] = (void *)func2;
    ...

    string s = myinput();
    if (funcs.find(s) != funcs.end()) {
        ((void (*)())funcs[s])();   // call the function (first casting it to the function's data type
    }
    else cout << "### Error: function " << s << " doesn't exist in map" << endl;

    return 0;
}
于 2013-04-17T05:16:39.653 に答える