C++-如何向拥有可变参数函数传入可变的参数?

发布于 2017-02-12 20:16:24 字数 456 浏览 1262 评论 5

#include <iostream>
using namespace std;

void func(int nSize,...) //什么类型都可以传,nSize指出个数
{
//这里的函数实现不需要关心
}

extern int num;
extern int num1;
int main()
{
int* n = new int[num];
string* s = new string[num1];
//这里初始化n和s数组
int nSize = num + num1;
func(nSize,/*这里怎么写*/);
delete []n;
delete []s;
return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

想挽留 2017-10-27 05:26:50

个人理解是,当程序运行时,函数传递了多少个参数实际上是确定的。
如果想实现运行时传递不同的参数,可以自己封装一个结构,规定如何保存参数。

虐人心 2017-08-06 02:44:50

不是很明确你的意思。
如果是关于如何实现一个变参函数,可以参考printf的实现。
如果是关于对于不同类型函数如何实现,按上面那位仁兄的说法,可以看看模板的内容。

虐人心 2017-06-29 01:20:37

调用函数的时候会将参数压入栈中, 所以只要我们知道函数的首地址 参数个数 参数类型 就能知道我们后面传入的每个参数到底是什么: 就像printf(" %d %s %d") 内部在解析的时候就知道有三个参数 类型依次是 char* int float 参数地址 第一个就是函数的函数地址 第二个参数是第一个参数偏移sizeof(int)字节 第三个就是 stlen(s) + sizeof(int)的偏移地址 。具体的这些实现可以看看 va_list va_start va_end

瑾兮 2017-03-16 02:20:05

个人理解 还是自己封装,这样的一个借口类,列如classic A,你可以往A里面插入任何数据,把A的对象穿进去,在解析A即可得到所有插入的数据。这样既方便又实用

偏爱自由 2017-02-14 14:08:20

自己找到了方法,大概就是这样,贴在这里:

#include <iostream>
#include <cstdarg>
using namespace std;

typedef int (*PCALLBACK)(int nCount,va_list vlist);

int addInt(int nCount,va_list vlist)
{
int sum = 0;
for (int i=0;i<nCount;i++)
{
sum+=va_arg(vlist,int);
}
return sum;
}

void func(PCALLBACK pCall,int nCount,...)
{
va_list valist;
va_start(valist,nCount);
cout<<pCall(nCount,valist)<<endl;
va_end(valist);
}

int main()
{
func((PCALLBACK)addInt,4,1,2,9,-4);
return 0;
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文