- ベストアンサー
可変引数を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); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
残念ながらないです. 「...」に当てはまる引数はすべて右辺値に変換されます (同様に配列名や関数名も対応するポインタに変換される). ついでにいうと, 変換した後の値が nonPOD なクラス型だとその振る舞いは未定義であるとなっています. だから, 参照で渡すのは (クラスかどうかには無関係に) 不可能です. というか, ポインタで渡しちゃだめなの?
その他の回答 (1)
- titokani
- ベストアンサー率19% (341/1726)
試していませんが、どうせ書くなら > 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]; ではないかと。
お礼
ああそうでしたね^^; まちがえてました
お礼
そうですか、どうも有り難うございました。