#include <iostream> #include <queue> #include "stdarg.h" using namespace std; struct Params { enum ParamsType{NILL,INT,CHAR,DBL}; ParamsType type; union { int noParams; int intParams; char charParams[256]; double doubleParams; }; static const Params NullParams;//声明,空参数,使用默认的构造函数Params();从而他的type为NILL; Params(){ noParams=0;type = NILL; }//默认构造函数 explicit Params(int p){ intParams = p; type = INT;} explicit Params(char* p){ strcpy(charParams,p); type = CHAR;} explicit Params(double p){ doubleParams = p; type = DBL;} inline bool isNull() { return (type == NILL)?true:false; } }; const Params Params::NullParams; std::queue<Params> PassValue(int count = 0,...) { std::queue<Params> pList; if(count<=0) return pList; va_list arg_ptr;//va_list 类型是在stdarg.h头文件中定义的,该指针用来依次指向各个实参。 va_start(arg_ptr,count);//va_start(arg_ptr,count); 这个宏的第二个实参是函数形参列表中活力号前面固定形参的名称,用来确定第一个可变实参的位置。 for (int i=0;i<count;i++) { //var_arg宏返回arg_ptr指向的位置存储的实参值,并使arg_ptr递增, //以指向下一个实参值。va_arg宏的第二个实参是第一个实参的类型, pList.push(va_arg(arg_ptr,Params)); } va_end(arg_ptr);//va_end宏将我们传递给它的实参--va_list类型的指针复位成空值。 return pList; } void main() { std::queue<Params> p( PassValue(2,Params(111),Params("222")) ); Params a1 = p.front(); cout << a1.intParams <<endl; p.pop(); Params a2 = p.front(); cout << a2.charParams <<endl; p.pop(); }