Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认参数和变量列表_C++_List_Templates_Variables - Fatal编程技术网

C++ 默认参数和变量列表

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

我在玩可变参数列表。请参考下面的代码片段。在这里,我试图在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);
}


在接受变量列表的函数中是否可能有默认参数?是的,那么怎么做呢?

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