Some ideas about dot operator overloding.
class C {
public:
int get() { return 1; }
};
int operator . square(const C& r)
{
return r.get() * r.get();
}
int main()
{
C c;
c.square(); //ok
square(c); //ok
}
What happens if C::square exists? ```cpp class C { public: int get() { return 1; }
int square() const
{
return r.get() * r.get();
}
};
//Error, ambiguous C already have C::square
int operator . square(const C& r)
{
return r.get() * r.get();
}
```
Enabling uniform call.
class C {
public:
int get() { return 1; }
int square() const
{
return r.get() * r.get();
}
};
using int operator . square(const C& r);
int main()
{
C c;
c.square(); //ok
square(c); //ok
}
Uniform call not enabled.
class C {
public:
int get() { return 1; }
int square() const
{
return r.get() * r.get();
}
};
int main()
{
C c;
c.square(); //ok
square(c); //error
}
For non-class types.
std::string operator . tostring(int i)
{
...
}
int main()
{
int i = 1;
std::string s = i.tostring();
}
Syntax alternatives
class C {
public:
int get() { return 1; }
};
int operator C::square() const
{
return this.get() * this.get();
}
How Non-Member Functions Improve Encapsulation - Scott Meyers