• ベストアンサー

C++、コンストラクタの引数の数を可変にしたい

次のようなプログラムを作ろうとしています。 あるクラスComponentは DIM(整数)次元(要素数)のdouble型配列と ここで DIM は別のところでconstで宣言されています。 (他にもいくつか変数を持っているのですが話に関係ないので割愛します) とりあえずこんな感じにしたいです。 class Component{ public: double x[DIM]; Component(double x,double y,double z, ,,,,,); //コンストラクタ } ここでコンストラクタComponentは引数にDIM個の実数をとり、たとえば DIM = 3のとき Component obj(1.0,2.0,3.0); と宣言したら obj.x[0]=1.0 obj.x[1]=2.0 obj.x[2]=3.0 となるようにしたいのです。 むろん代入すること自体は代入すればよいのですが 外で宣言されているDIMによってコンストラクタの引数の数が変わってしまいます。 こういう時はどのような解決策があるでしょうか。 今書いたのと全然違うやり方でもかまいません。 (ただ何個も何個もコンストラクタをオーバーロードするのは避けたいです。 いろんなDIM次元で実験がしたく、きりがありません)。 よろしくお願いいたします!

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

  • ベストアンサー
回答No.3

型のチェックがゆるくなりますが、可変長引数使って: template <std::size_t DIM> class Component { public:   Component(double arg0, ...)   ...

R-gray
質問者

お礼

可変長引数、調べてみました。こんなすばらしいやり方があるのですね。 どうにかできそうです。ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

こういうのは、 template <std::size_t DIM> class Component { public:  template <class InputIterator>   Component(InputIterator first, InputIterator last);  ... }; とするのが常套手段ではないでしょうか?

R-gray
質問者

お礼

そういうやりかたがあるのですか。 sizt_t DIMというのはどういう意味があるものなのでしょうか。 もう少し勉強が必要なようです。ありがとうございました!

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

引数の値はそれぞれ独立して渡す必要はありますか? でなければ、あまりスマートとは言えませんが、 引数の要素は一旦配列に格納し、ポインタで配列の先頭アドレスと要素数を渡し、 コンストラクタ内で要素数分の領域を確保して引数で渡したポインタに紐漬けられた値を代入すればいいのでは? ついでに要素数もメンバ変数に保存しておけば、以降のループ処理(あれば)のリミッタとしても使用できますよ。 あと、デストラクタでの領域解放は忘れずに。

R-gray
質問者

お礼

なるほど、僕にもとてもわかりやすい方法です。 ありがとうございました!

関連するQ&A

専門家に質問してみよう