Могу ли я перегрузить статический оператор в классе?

В C # для перегрузки таких операторов, как ‘+’, ‘-‘ и т. Д., Я должен сделать функцию статическим членом класса:

class MyType
{
/*...*/

public static MyType operator+ (MyType a, MyType b)
{
MyType ret;
/* do something*/
return ret;
}
}

Насколько я знаю, в C ++ я могу перегрузить оператор:

class MyType
{
/*...*/

public:
MyType operator+ (MyType b) // *this is the first operand
{
MyType ret;
/* do something*/
return ret;
}
};

Проблема в том, что *this это первый операнд, поэтому первый операнд должен иметь тип MyType. Например, если я хочу добавить MyType в целое число:

MyType a, b;
b = a + 1;  // Valid
b = 1 + a;  // Error

В C # я могу перегрузить оператор «+» для каждого случая.

Мой вопрос: могу ли я сделать в C ++ так же, как в C #, использовать статические операторы? Насколько я знаю, есть один способ сделать это с дружественными операторами, но они теряются при наследовании функции.

2

Решение

Сделать operator+ перегрузка с int на левой стороне свободная функция вместо функции-члена MyType:

class MyType
{
...

// MyType + int can be a member function because MyType
// is the type of the sum's left hand side
MyType operator+(int rhs) const;
};

// int + MyType needs to be a free function because
// int is the type of the sum's left hand side
MyType operator+(int lhs, const MyType &rhs);

Еще одна распространенная идиома — сделать перегрузки friend из класса интересов. Теперь вы можете реализовать оба варианта одинаково:

class MyType
{
...

friend MyType operator+(int lhs, const MyType &rhs)
{
// get access to MyType's private members here
// to implement the sum operation
...
}

friend MyType operator+(const MyType &lhs, int rhs)
{
// you can also implement the symmetric case
// of int on the right hand side here
...
}
};

Обратите внимание, что хотя operator+ перегрузки выглядят как функции-члены во втором примере, они на самом деле являются свободными функциями, которые живут в глобальной области видимости из-за их объявления как friendс MyType,

3

Другие решения

Вы можете определить оператор в глобальной области видимости в C ++, например,

MyType operator+ (const MyType& a, const MyType& b)
{
MyType ret;
/* do something*/
return ret;
}

Вам может понадобиться добавить объявление друга в MyType если оператор должен получить доступ к закрытым членам класса.

3

По вопросам рекламы [email protected]