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

Prime_Bull

我正在尝试创建以可变参数函数为参数的函数,但是我不知道如何以正确的方式进行操作。这是我的尝试:

#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;
}
讲故事的人-Unslander Monica

这里...

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

这将共同带来您似乎想要实现的效果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章