C++ 默认参数和变量列表
我在玩可变参数列表。请参考下面的代码片段。在这里,我试图在Foobar中打印用户定义类型的内容C++ 默认参数和变量列表,c++,list,templates,variables,C++,List,Templates,Variables,我在玩可变参数列表。请参考下面的代码片段。在这里,我试图在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 = v
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);
}
在接受变量列表的函数中是否可能有默认参数?是的,那么怎么做呢?在C++11中,可以使用可变模板 在C++03中,为什么不创建一个正确类型的普通第一个参数,并从第二个参数开始创建一个变量参数列表,而不是引入一个“伪”参数?或者调用模板的专门化,如
Foobar
?在C++11中可以:
void Foobar(){}
模板
void Foobar(const First&val,Rest…args)
{
val.PrintContent();
Foobar(args…);
}
模板
void Foobar(const int val、Rest…args)
{
std::难道你真的不能对类对象使用变量函数吗?这是不需要的(即使它可能在某些编译器中工作)它不适用于G+或CLAN。这里不能从第二个参数得到一个可变参数列表。从第三个参数上可以有一个可变参数列表。除非它不能工作。ValueAd函数使用古C(前C标准)参数传递:整数、双倍、指针,而没有别的。C++ 03代码>空格FooBar。(int-nNumberofParams,…)
将不起作用。有趣的是,如果您同时拥有1.template void Foobar(const t&obj,int-nNumberofParams,…)和2.template void Foobar(int-nNumberofParams,…)然后它显示errorYep,你是对的-如果没有合适的参数,编译器无法专门化这个函数。你仍然可以这样做:现在让它为MyClass工作。你不能这样做,因为标准不支持提问者试图做的事。它为MyStruct
工作。你看到我是如何编辑的吗回答?检查
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;
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...);
}
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);
}