検索

ホームページ  >  に質問  >  本文

重载操作符 - c++中操作符重载需要写多种重复版本(引用与右值引用),有无方法可以简化

例如:

mat33 operator +(mat33& m1, mat33& m2);
mat33 operator -(mat33& m1, mat33& m2);
mat33 operator +(mat33&& m1, mat33&& m2);
mat33 operator -(mat33&& m1, mat33&& m2);
mat33 operator +(mat33&& m1, mat33& m2);
mat33 operator -(mat33&& m1, mat33& m2);
mat33 operator +(mat33& m1, mat33&& m2);
mat33 operator -(mat33& m1, mat33&& m2);

有无什么方法可以简化这一大串?

高洛峰高洛峰2787日前817

全員に返信(2)返信します

  • 迷茫

    迷茫2017-04-17 15:40:40

    宣言の数を減らしたい場合は、コードを単純化することは不可能に思える方法があります。宣言のアイデアに従って、&&,&&&&,&&,&& に作業を委任できます。こうすることでコードは複雑にならず、重複もありません。

    ここでは少なくとも 2 つの実装が必要です。1 つはデータを移動し、もう 1 つはデータを移動しません。モバイルデータは左側と右側に分かれています。同時にADLも考慮する必要があります。これを実装するには、少なくとも 3 つのオーバーロードを宣言する必要があります。テンプレートを使用すると、宣言を 2 つに減らすことができます:

    リーリー

    追記: C++17 以降では、constexpr if を使用して静的分岐を実装できます。通常、C++17 より前のコンパイラーでは、このような最適化を完了できます。

    テストコード:

    リーリー

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:40:40

    リーリー

    完了です。 。 。
    const & すべての参照 (左辺値、右辺値、定数左辺値、定数右辺値) と一致します。

    返事
    0
  • キャンセル返事