実現したいこと
C++の勉強をかねて、数学のベクトルをプログラムで表現してみようと思い立ちました。
そこで、下記のようなコードを書いています。
外積に関しては、ベクトルが3次元のときだけ外積の計算結果ベクトルを返すようにしたいです。一応、2次元のときの内×内、外×外の和の値はオプション程度で書いてみました。
↑これらは次元数が2か3のときしか必要ない為、下記コード中DIMENSIONが2,3のときだけ外積計算の関数を追加した、部分特殊化テンプレートを書くことになります。
発生している問題・分からないこと
テンプレートの特殊化は初めての経験なのですが、コード書いていて外積以外の処理も特殊化の方で書かないといけないのが面倒で、うまい書き方は無いのかなと思っています。
クラスの継承みたいに、追加する内容だけ書けたら、と思うのですが、何か方法ありますでしょうか。
該当のソースコード
C++
1template<class R, int DIMENSION> 2class VECTOR { 3private: 4 R val[DIMENSION]; 5 6public: 7 VECTOR() {} 8 VECTOR(const R r[DIMENSION]) { 9 for (int i = 0; i < DIMENSION; i++) { 10 val[i] = r[i]; 11 } 12 } 13 VECTOR(array<R, DIMENSION>& r) { 14 for (int i = 0; i < DIMENSION; i++) { 15 val[i] = r[i]; 16 } 17 } 18 19 20 21 //cast 22 operator array<R, DIMENSION>() const { 23 array<R, DIMENSION> ret; 24 for (int i = 0; i < DIMENSION; i++) ret[i] = val[i]; 25 return ret; 26 } 27 28 29 30 //operator 31 //assignment 32 VECTOR<R, DIMENSION>& operator=(const VECTOR<R, DIMENSION>& vec) { 33 for (int i = 0; i < DIMENSION; i++) this->val[i] = vec[i]; 34 return *this; 35 } 36 //index 37 R operator[](const int i) { 38 return this->val[i]; 39 } 40 //addition 41 VECTOR<R, DIMENSION>& operator+(const VECTOR<R, DIMENSION>& vec) { 42 VECTOR<R, DIMENSION> ret; 43 for (int i = 0; i < DIMENSION; i++) ret = this->val[i] + vec.val[i]; 44 return ret; 45 } 46 //reduction 47 VECTOR<R, DIMENSION>& operator-(const VECTOR<R, DIMENSION>& vec) { 48 VECTOR<R, DIMENSION> ret; 49 for (int i = 0; i < DIMENSION; i++) ret = this->val[i] - vec.val[i]; 50 return ret; 51 } 52 //inner product 53 R operator*(const VECTOR<R, DIMENSION>& vec) { 54 R ret = 0; 55 for (int i = 0; i < DIMENSION; i++) ret += this->val[i] * vec.val[i]; 56 return ret; 57 } 58}; 59 60template<class R> 61class VECTOR<R, 3> { 62 63 //ここにプライマリのクラスと同じ内容を書いている。 64 //これが面倒。 65 66 //outer product 67 VECTOR<R, 3>& outer_product(const VECTOR<R, 3>& vec) { 68 VECTOR<R, 3> ret; 69 ret[0] = this->val[1] * vec.val[2] - this->val[2] * vec.val[1]; 70 ret[1] = this->val[2] * vec.val[3] - this->val[3] * vec.val[2]; 71 ret[2] = this->val[0] * vec.val[1] - this->val[1] * vec.val[0]; 72 return ret; 73 } 74}; 75 76template<class R> 77class VECTOR<R, 2> { 78 79 //ここにプライマリのクラスと同じ内容を書いている。 80 //これが面倒。 81 82 //outer product 83 R outer_product(const VECTOR<R, 2>& vec) { 84 R ret; 85 ret = this->val[0] * vec.val[1] - this->val[1] * vec.val[0]; 86 return ret; 87 } 88};
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
特定のメンバ関数のみ特殊化するというのもありましたが、部分特殊化の場合は使えないようですね。
関数オブジェクトをstructで包んで...みたいなのもありましたが、2次元と3次元で戻り値の型が違うので、どうしたものかと。
是非宜しくお願い致します。
補足
特になし

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/26 04:09 編集
2024/02/27 12:57
2024/03/04 03:53