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

例如:

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)
迷茫

선언 수를 줄이고 싶다면 방법이 있지만, 코드를 단순화하는 것은 불가능해 보입니다. 귀하의 선언 아이디어에 따라 &&,&&&&,&&,&&에게 업무를 위임할 수 있습니다. 이렇게 하면 코드가 복잡하지 않고 중복도 없습니다.

여기에는 최소한 두 가지 구현이 필요합니다. 하나는 데이터를 이동하고 다른 하나는 데이터를 이동하지 않습니다. 모바일 데이터는 lhs와 rhs로 구분됩니다. 동시에 ADL도 고려해야 합니다. 이를 구현하려면 최소한 3개의 오버로드를 선언해야 합니다. 템플릿을 사용하면 선언을 두 가지로 줄일 수 있습니다.

으아아아

PS: c 17 이후에는 constexpr if를 사용하여 정적 분기를 구현할 수 있습니다. C 17 이전의 컴파일러는 일반적으로 이러한 최적화를 완료할 수 있습니다.

테스트 코드:

으아아아
小葫芦

으아악

완료되었습니다. . .
const &는 모든 참조(lvalue, rvalue, 상수 lvalue, 상수 rvalue)와 일치할 수 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿