以可变函数作为参数的函数

Pri*_*ull 3 c++ parameters pointers arguments

我正在尝试创建以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;
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

这里...

func(add(2, 1, 2))
Run Code Online (Sandbox Code Playgroud)

...调用函数add并尝试将结果传递给func.这是一个没有强制转换的整数指针.所以你得到一个错误.

要传递函数本身(在适当的函数之后转换为指针)你会这样做:

func(add)
Run Code Online (Sandbox Code Playgroud)

但是,您的实现func尝试通过转换函数指针来返回整数.我强烈怀疑这不是你想要的.如果您打算调用可变参数函数,则可以执行以下操作:

int func(int (*func_arg)(int args, ...)) {
    return func_arg(2, 1, 2);
}
Run Code Online (Sandbox Code Playgroud)

但那当然是硬编码的论点.如果您希望允许传递参数,则需要进行轻微的设计更改.


说了这么多,如果你希望支持func传入可能返回整数的任何东西的调用者,你可以使用库类型std::function来实现它.然后你的功能会变成这样:

int func(std::function<int()> func_arg) {
    return func_arg(); //Invoke the callable
}
Run Code Online (Sandbox Code Playgroud)

呼叫站点将能够通过简单的lambda来适应它:

func([]{ return add(2, 1, 2); })
Run Code Online (Sandbox Code Playgroud)

这将成为你似乎有意实现的效果.