Если вы планируете реализовать потоковые операторы (<< и >>), то они будут методами, не являющимися членами, поскольку ваш объект находится слева от оператора.
Если вы планируете реализовать ->, () или [], то это естественные методы-члены.
Для остальных (сравнительных и математических) вы должны проверить Boost.Operators , это действительно помогает.
Например, если вы хотите реализовать следующие операторы:
MyClass& MyClass::operator+=(int);
MyClass operator+(const MyClass&, int);
MyClass operator+(int, const MyClass&);
Вам нужно только написать:
class MyClass: boost::operator::addable<MyClass,int> // no need for public there
{
public:
MyClass& operator+=(int);
private:
};
2 operator+
будут автоматически сгенерированы как не члены, что позволит вам воспользоваться автоматическими конверсиями. И они будут эффективно реализованы в терминах operator+=
, поэтому вы пишете код только один раз.