假设我有两个功能:
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
我希望问题很清楚,并且可以解决。
由于
答案 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 ++没有这些东西。您必须执行转换。