如何在C ++中将值数组转换为参数

时间:2012-10-01 14:33:29

标签: c++ function dynamic arguments

假设我有两个功能:

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

我需要动态调用该函数。使用没有参数的函数来实现它非常简单,我只是创建了一个map(string function_name =>指向函数的指针)。

现在我也想传递参数,所以我想将数组转换为实际参数,如下所示:

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

我希望问题很清楚,并且可以解决。

由于

3 个答案:

答案 0 :(得分:2)

只需将参数作为集合传递:

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

无需回调或变数。

答案 1 :(得分:2)

受到这个答案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参数的这种情况。

答案 2 :(得分:1)

你需要动态类型检查来完成这项工作 - 顺便说一句,这意味着像Lua或Python这样的动态语言。

编辑:ASP.NET通过特殊的预处理步骤和反射来完成此操作。 C ++没有这些东西。您必须执行转换。