• ベストアンサー

可変引数をconstで参照渡し

以下のようなクラスをconstの参照渡しでうけとる、可変引数を持つ関数を作りたいのですが、以下のようにしてもうまくいきません。 何か良い方法はないものでしょうか? template<class TT> class vector3{ public:  enum{NUM=3};  TT x[NUM];  void Sum(const int num,...); }; template<class TT> void vector3<TT>::Sum(const int num,const ...){  int i,j;  va_list list;  va_start(list,num);  for(i=0;i<NUM;i++){   x[i]=va_arg(list,&vector3<TT>).x[i];  }  for(j=1;j<num;j++){   for(i=0;i<NUM;i++){    x[i]+=va_arg(list,&vector3<TT>).x[i];   }  }  va_end(list); }

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

残念ながらないです. 「...」に当てはまる引数はすべて右辺値に変換されます (同様に配列名や関数名も対応するポインタに変換される). ついでにいうと, 変換した後の値が nonPOD なクラス型だとその振る舞いは未定義であるとなっています. だから, 参照で渡すのは (クラスかどうかには無関係に) 不可能です. というか, ポインタで渡しちゃだめなの?

coronalith
質問者

お礼

そうですか、どうも有り難うございました。

その他の回答 (1)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

試していませんが、どうせ書くなら >  x[i]=va_arg(list,&vector3<TT>).x[i]; >   x[i]+=va_arg(list,&vector3<TT>).x[i]; ではなくて、   x[i]=va_arg(list,vector3<TT>&).x[i];    x[i]+=va_arg(list,vector3<TT>&).x[i]; ではないかと。

coronalith
質問者

お礼

ああそうでしたね^^; まちがえてました