質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

771閲覧

C++の演算子オーバーロードで、似た処理をまとめたい

takey

総合スコア312

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/10 19:19

編集2021/02/10 20:04

前置き

以下のようなブロードキャスト計算が可能な、自作のベクトルクラスVectorを作成しました。

cpp

1Vector vec(3); // 要素数3のvector<double>を作成 2vec[0] = 0; 3vec[1] = 1; 4vec[2] = 2; 5 6vec *= 2; // 各要素に2をかける 7// vec = {0, 2, 4} 8 9vec *= 2.1; // 各要素に2.1をかける 10// vec = {0, 4.2, 8.4}

この機能を実装したコードは後述しています。見てほしい箇所は、以下の(★1)と(★2)でそれぞれ囲まれた部分です。

/*** (★1)ここから ***/ ... /*** (★1)ここまで ***/
/*** (★2)ここから ***/ ... /*** (★2)ここまで ***/

コード

cpp

1#include <bits/stdc++.h> 2using namespace std; 3 4 5class Vector { 6 private: 7 vector<double> v; 8 public: 9 size_t size; 10 Vector(size_t size=0) { 11 this->size = size; 12 this->v.resize(size); 13 } 14 15 double& operator[](const size_t i) { 16 return this->v[i]; 17 } 18 19 /*** (★1)ここから ***/ 20 Vector& operator*=(const int a) { 21 /* 各要素にaをかける */ 22 vector<double> res = this->v; 23 for (size_t i=0; i<this->size; i++) { 24 res[i] *= a; 25 } 26 this->v = res; 27 return *this; 28 } 29 const Vector operator*(const int a) { 30 return Vector(*this) *= a; 31 } 32 /*** (★1)ここまで ***/ 33 34 /*** (★2)ここから ***/ 35 Vector& operator*=(const double a) { 36 /* 各要素にaをかける */ 37 vector<double> res = this->v; 38 for (size_t i=0; i<this->size; i++) { 39 res[i] *= a; 40 } 41 this->v = res; 42 return *this; 43 } 44 const Vector operator*(const double a) { 45 return Vector(*this) *= a; 46 } 47 /*** (★2)ここまで ***/ 48 49 void print() { 50 int len = 0; 51 for (size_t i=0; i<this->size; i++) { 52 string str = to_string(this->v[i]); 53 len = max(len, (int)str.size()); 54 } 55 56 printf("["); 57 for (size_t i=0; i<this->size; i++) { 58 printf("%*lf", len, this->v[i]); 59 if (i!=this->size-1) printf(", "); 60 } 61 printf("]\n"); 62 } 63}; 64 65void test(){ 66 Vector vec(3); 67 vec[0] = 0; 68 vec[1] = 1; 69 vec[2] = 2; 70 71 vec *= 2; 72 vec.print(); 73 // [0.000000, 2.000000, 4.000000] 74 vec *= 2.1; 75 vec.print(); 76 // [0.000000, 4.200000, 8.400000] 77} 78 79 80int main(int argc, char const *argv[]){ 81 test(); 82 return 0; 83} 84

やりたいこと

(★1)と(★2)は処理としてはほぼ同じで、違うところは、

  • (★1)は引数がconst int a
  • (★2)は引数がconst double a

という部分だけです。

この(★1)と(★2)をうまくまとめる方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この(★1)と(★2)をうまくまとめる方法はないでしょうか?

常に中身がvector<double>なのであれば、double版だけ用意すればいいかと思います。

投稿2021/02/11 00:02

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2021/02/11 00:58

確かにその通りですね…ありがとうございました。
guest

0

tenplateを使えばできるかも知れません。

C++

1template<typename TYPE>Vector& operator*=(const TYPE a) { 2 /* 各要素にaをかける */ 3 for ( double& e : this->v ) { 4 e *= a; 5 }; 6 return *this; 7 }

ただ引数 a がdoubleとintに明確に区別できない場合はエラーになるので、少々使い勝手が悪いかも知れません。

各要素にaをかけるのであれば、一時変数 res に受けず、上記のように直接値を書き換えてもよいかと思います。また、const Vectorを返す関数ですが、返り値を const で扱うかどうかは呼び出し側が決めればよいことなので、用意する必要はないかなと思います。

投稿2021/02/13 03:59

Serbonis

総合スコア581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問