gpt4 book ai didi

c++ - 以可变参数函数为参数的函数

转载 作者:太空狗 更新时间:2023-10-29 20:34:14 27 4
gpt4 key购买 nike

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

#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 实现试图通过转换函数指针来返回一个整数。我强烈怀疑那不是你想要的。如果你打算调用可变参数函数,你可以这样做:

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

这将共同产生您似乎有意实现的效果。

关于c++ - 以可变参数函数为参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49965827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com