将variadic函数作为参数的函数

Function which takes variadic function as parameter

本文关键字:函数 参数 variadic      更新时间:2023-10-16

我正在尝试创建将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;
}

这...

func(add(2, 1, 2))

...调用函数add,并试图将结果传递到func中。那是通过没有演员等整数制作的指针。因此,您会遇到错误。

要传递函数本身(在适当的函数到指针转换之后(,您将执行此操作:

func(add)

但是,您对func的实现试图通过转换功能指针来返回整数。我强烈怀疑这不是您想要的。如果您打算调用variadic函数,则可以执行此操作:

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); })

这将融合在一起,您似乎打算实现。