4

私は2つの機能を持っているとしましょう:

void a(int arg1) { ... }
void b(int arg1, arg2) { ... }

また、呼び出したい関数の名前を含む文字列と、すべてのパラメーターを含む配列もあります。

string func_name = "b"; // 'a' or 'b'
int args[] = { 1, 2 }; // has either 1 or 2 values

関数を動的に呼び出す必要があります。引数のない関数でそれを行うのは非常に簡単です。マップを作成しただけです (文字列 function_name => 関数へのポインター)。

今度は引数も渡したいので、次のように配列を実際の引数に変換します。

auto f = std::bind(b, args); // Doesn't compile, requires 1,2 as arguments

問題が明確で、解決可能であることを願っています。

ありがとう

4

3 に答える 3

3

この回答に触発されてhttps://stackoverflow.com/a/1287060/942596マクロを使用してあなたが望むものを達成することができます

#define BUILD0(x) x[0]
#define BUILD1(x) BUILD0(x), x[1]
#define BUILD2(x) BUILD1(x), x[2]
#define BUILD3(x) BUILD2(x), x[3]
#define BUILD(x, i) BUILD##i(x)


void foo(int i) {std::cout << i << std::endl;}
void foo(int i, int j) {std::cout << j << std::endl;}
void foo(int i, int j, int k) {std::cout << k << std::endl;}
void foo(int i, int j, int k, int l) {std::cout << l << std::endl;}

int main() {
    int x[] = {1, 2, 3};
    boost::bind(foo, BUILD(x, 2))();
}

ノード:これは、0パラメーターのこの状況を考慮していません。

于 2012-10-01T15:06:29.447 に答える
1

パラメータをコレクションとして渡すだけです。

void a(std::vector<int> args)
{
    //...
}

コールバックや可変引数は必要ありません。

于 2012-10-01T14:34:59.520 に答える
1

これを機能させるには、動的型チェックが必要です。ちなみに、Lua や Python のような動的言語を意味します。

編集: ASP.NET は、特別な前処理手順とリフレクションによってこれを行います。C++ にはそのどちらもありません。変換を実行する必要があります。

于 2012-10-01T14:37:13.897 に答える