1

可変パラメータリストで遊んでいました。以下のコード スニペットを参照してください。ここでは、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;

}

変数リストを取る関数にデフォルトの引数を持つことは可能ですか? はい、それではどうすればいいですか?

4

2 に答える 2

3

C++11 では、可変個引数テンプレートを使用できます。

C++03 では、「ダミー」パラメーターを導入する代わりに、正しい型の通常の最初のパラメーターを作成し、2 番目のパラメーターから変数パラメーター リストを作成してみませんか? または、テンプレートの特殊化を次のように呼び出しFoobar<int>ますか?

于 2012-09-05T08:39:09.370 に答える
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);

少しシンプルです。

于 2012-09-05T08:50:16.787 に答える