C++-如何向拥有可变参数函数传入可变的参数?
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
个人理解是,当程序运行时,函数传递了多少个参数实际上是确定的。
如果想实现运行时传递不同的参数,可以自己封装一个结构,规定如何保存参数。
不是很明确你的意思。
如果是关于如何实现一个变参函数,可以参考printf的实现。
如果是关于对于不同类型函数如何实现,按上面那位仁兄的说法,可以看看模板的内容。
调用函数的时候会将参数压入栈中, 所以只要我们知道函数的首地址 参数个数 参数类型 就能知道我们后面传入的每个参数到底是什么: 就像printf(" %d %s %d") 内部在解析的时候就知道有三个参数 类型依次是 char* int float 参数地址 第一个就是函数的函数地址 第二个参数是第一个参数偏移sizeof(int)字节 第三个就是 stlen(s) + sizeof(int)的偏移地址 。具体的这些实现可以看看 va_list va_start va_end
个人理解 还是自己封装,这样的一个借口类,列如classic A,你可以往A里面插入任何数据,把A的对象穿进去,在解析A即可得到所有插入的数据。这样既方便又实用
自己找到了方法,大概就是这样,贴在这里:
#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;
}