Принцип наименьшего удивления говорит о том, что ваша перегрузка должна вести себя
более или менее похожи на встроенные операторы. Обычное решение здесь
не для реализации operator+
, а для реализации:
D& operator+=( D const& rhs );
в качестве члена, а затем происходит от чего-то вроде:
template<typename T>
class ArithmeticOperators
{
friend T operator+( T const& lhs, T const& rhs )
{
T result( lhs );
result += rhs;
return result;
}
// Same thing for all of the other binary operators...
};
Таким образом, вам не нужно переписывать одно и то же каждый раз, когда вы определяете
класс, который перегружает арифметические операторы, и вы гарантированно
что семантика +
и +=
соответствует.
(friend
в приведенном выше просто для того, чтобы вы могли поставить функцию,
вместе с его реализацией, в самом классе, где ADL найдет
она.)