重载操作符 - c++中操作符重载需要写多种重复版本(引用与右值引用),有无方法可以简化
高洛峰
高洛峰 2017-04-17 15:38:40
0
2
813

例如:

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);

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
迷茫

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

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

リーリー

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

テストコード:

リーリー
いいねを押す +0
小葫芦

リーリー

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート