Могу ли я создать футляр для функции друга на месте?
В c ++ 11 вы можете объявить и написать функцию своего друга внутри класса, что может сделать ее намного лучше:
class MyNumber
{
private:
Clever c;
Clever Multiply (Clever, i) { ... }
public:
MyNumber operator * (int i)const { return Multiply(c,i) }
MyNumber operator * (const MyNumber &i)const { ... }
const MyNumber& operator *= (int i) { return c= Multiply(c, i); }
// introducing the inline friend (presuming multiply is commutative/symmetric here)
friend MyNumber operator (int i, const MyNumber& j) { return j.Multiply(c,i); }
};
Обратите внимание, что эта функция-друг все еще является глобальной функцией и имеет доступ к внутренним объектам класса, но ее реализация теперь аккуратно находится внутри определения класса.
Аккуратность этого стиля такова, что я испытываю желание использовать его, даже когда мне на самом деле не нужен доступ к грязному другу.
С этими математическими объектами перегрузки также учитывайте перегрузки замещения RValue. Реализация rvalue двоичного умножения, реализованного как множественное назначение, может показать некоторую эффективность, хотя, возможно, не так уж много, только с классом дроби с 2 значениями.