我正在玩变量参数列表。请参阅以下代码段。在这里,我试图在Foobar中打印用户定义类型的内容。
template<typename T>
void Foobar(const T& obj,int nNumberofParams,...)
{
va_list args;
va_start(args,nNumberofParams);
for(int i =0 ; i < nNumberofParams; i++)
{
T val = va_arg(args,T);
val.PrintContent();
}
va_end(args);
}
//! Template Specialization for int
template<>
void Foobar(const int& ,int nNumberofParams,...)
{
va_list args;
va_start(args,nNumberofParams);
cout << "Foobar specialize for int called" << endl;
for(int i =0 ; i < nNumberofParams; i++)
{
int val = va_arg(args,int);
cout << val << endl;
}
va_end(args);
}
主要是我正在做这样的事情
int _tmain(int argc, _TCHAR* argv[])
{
//! MyClass implements PrintContent
MyClass obj,obj1(1,2,0),obj2(3,4,1),obj3,obj4(5,5,2),obj5(6,6,3);
Foobar(obj,5,obj1,obj2,obj3,obj4,obj5);// Works fine
//! Can't this be simpler ?
int i = 3;
int &j = i;
Foobar(j,3,1,2,3);// Template specialization for int
//! Can't this be simpler ?
double d = 3.0;
double& d1 = d;
Foobar(d1,3, 1.0,2.0,3.0);// Template specialization for double
return 0;
}
是否可以在采用变量列表的函数中使用默认参数?是的,然后怎么做?
答案 0 :(得分:3)
在C ++ 11中,您可以使用可变参数模板。
在C ++ 03中,为什么不制作正确类型的普通第一个参数,并且从第二个参数开始具有变量参数列表而不是引入“虚拟”参数?或者调用模板的专业化,如Foobar<int>
?
答案 1 :(得分:0)
在C ++ 11中可以:http://ideone.com/9CGz4
void Foobar() {}
template<typename First, typename... Rest>
void Foobar(const First &val, Rest... args)
{
val.PrintContent();
Foobar(args...);
}
template<typename... Rest>
void Foobar(const int val, Rest... args)
{
std::cout << val << std::endl;
Foobar(args...);
}
从C ++ 03开始:http://ideone.com/36lA5
template<typename T>
void Print(T val) {
cout << val << endl;
}
struct MyStruct {
MyStruct(int a) : b(a) {}
void print() { cout << "MS: " << b << endl; }
int b;
};
void Print(MyStruct &val) {
val.print();
}
template<typename T>
void Foobar(int nNumberofParams, ...) {
va_list args;
va_start(args,nNumberofParams);
for(int i =0 ; i < nNumberofParams; i++)
{
T val = va_arg(args,T);
Print(val);
}
va_end(args);
}
然后专门设定Print
以满足您的需求。
Foobar<MyStruct>(2, MyStruct(1), MyStruct(2));
甚至
Foobar<MyStruct>(2, 1, 2);
这有点简单。