4

假设我有两个功能:

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 回答