2017-08-24 10 views
4

私はある種の行列ライブラリを書いていますので、演算子のオーバーロードを使って行列にoperator +を与えました。このような感じです。演算子のオーバーロードC++、(+、 - 、*、/ etc.)コピー、置換、貼り付けよりスマートな方法がありますか?

friend matrix<T, size_x, size_y> operator + (const matrix<T, size_x, size_y> & Input_1, const matrix<T, size_x, size_y> & Input_2){ 
    matrix<T, size_x, size_y> Output; 
     for (int i=0; i<size_x; i++){ 
      for (int j=0; j<size_y; j++){ 
       Output.value[i][j]=Input_1.value[i][j]+Input_2.value[i][j]; 
      } 
     } 
    return Output; 
}  

これまでのところ、テストしたとおりに動作します。今、私は - 、/、*演算子も追加したいのですが、それらはすべて同じように動作します。もちろん、コピー、置き換え、貼り付けができます。しかし、これは可読性と保守性に悪いです。私はそれにグーグルの概念の名前を知らないので、よりスマートなソリューションとおそらく概念はありますか?私はちょうど単一の演算子を過負荷にする方法を見つけた。

+3

+、 - 、*、および/(それぞれ、+と - と同じネストされたループではない行列乗算サウンドですが)のコールバック関数を持つネストされたforループの1つの断片が必要です。しかし、依然としてオーバーロードを分ける必要があります。コードの行数、コンパイル時間と実行時間の最適化(もしあれば)のために、私はコピーと貼り付けと修正を強くお勧めします。 –

+3

誰もそれを期待していないので、私はもう少し注意して*と/そして同じことをするでしょう。行列の乗算はそのようには機能しません。 @Ken Cheung。 – UKMonkey

+0

ありがとうございました。あなたは私の研究のために新しいポイントを与えました。 Greetings Markus – Markus

答えて

11

あなたがtemplateと(呼び出したときに作成される一時lambda expressionのために必要な)rvalue reference &&を使用する場合があります。

template <typename F> 
friend matrix<T, size_x, size_y> doBinOp(F&& f, 
              const matrix<T, size_x, size_y> & Input_1, 
              const matrix<T, size_x, size_y> & Input_2) 
{ 
    matrix<T, size_x, size_y> Output; 
    for (int i=0; i<size_x; i++) { 
     for (int j=0; j<size_y; j++) { 
      Output.value[i][j] = f(Input_1.value[i][j], Input_2.value[i][j]); 
     } 
    } 
    return Output; 
} 

そして残念ながら

friend matrix<T, size_x, size_y> operator + (const matrix<T, size_x, size_y> & Input_1, 
               const matrix<T, size_x, size_y> & Input_2) 
{ 
    return doBinOp([](auto l, auto r) { return l + r; }, Input_1, Input_2); 
} 
+0

ラムダ式とr値参照&&に精通していません。おかげさまで、私は今それを試して学びます。 – Markus

+0

この参照には左辺値にバインドする機能があるので、ここでは転送参照の方が適切だと思われます。 –

0

、+としながら、 - マトリックス上ほとんど同じですが、行列の*と/は+と - と全く違った働きをします。

2つのインプリメンテーションを4つに統一できることを考慮して、私は単純にしておきます(7行の2つの関数を7行のテンプレートと2つのライナー関数に置き換えます)。

学習の練習としては素晴らしいですが、ちょっとしないでください。

関連する問題