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

前端开发 前端开发 主题:1148 回复:2395

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

灵芸 发布于 2017-02-12 字数 493 浏览 1112 回复 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;
}

发布评论

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

支持 Markdown 语法,需要帮助?

评论(5

想挽留 2017-10-27 5 楼

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

虐人心 2017-08-06 4 楼

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

虐人心 2017-06-29 3 楼

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

瑾兮 2017-03-16 2 楼

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

偏爱自由 2017-02-14 1 楼

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

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