我正在尝试创建以variadic函数作为参数的函数,但我无法弄清楚如何以正确的方式执行它。这是我的尝试:
#include <iostream>
#include <cstdarg>
using namespace std;
int add(int args, ...) {
int res = 0;
va_list ap;
va_start(ap, args);
for(int i=0; i < args; ++i)
res += va_arg(ap, int);
va_end(ap);
return res;
}
int func(int (*func_arg)(int args, ...)) {
return func_arg; //error
}
int main() {
cout << add(2, 1, 2) << endl; //working
cout << func(add(2, 1, 2)); //error
return 0;
}
答案 0 :(得分:5)
这就是......
func(add(2, 1, 2))
...调用函数add
并尝试将结果传递给func
。这是一个没有强制转换的整数指针。所以你得到一个错误。
要传递函数本身(在适当的函数转换为指针之后),你可以这样做:
func(add)
但是,func
的实现尝试通过转换函数指针来返回整数。我强烈怀疑这不是你想要的。如果您打算调用可变参数函数,则可以执行以下操作:
int func(int (*func_arg)(int args, ...)) {
return func_arg(2, 1, 2);
}
但那当然是硬编码的论点。如果您希望允许传递参数,则需要进行轻微的设计更改。
说了这么多,如果你希望支持func
传入可能返回整数的任何东西的调用者,你可以使用库类型std::function
来实现它。然后你的功能会变成这样:
int func(std::function<int()> func_arg) {
return func_arg(); //Invoke the callable
}
呼叫网站将能够通过一个简单的lambda来适应它:
func([]{ return add(2, 1, 2); })
这将成为你似乎有意实现的效果。