template<typename Friend, typename FieldType>
class crazyconst
{
struct identity { typedef Friend type; };
FieldType value;
friend class identity::type;
FieldType& operator=(const FieldType& newValue) { return value = newValue; }
public:
operator FieldType(void) const { return value; }
FieldType operator()(void) const { return value; }
};
class A
{
public:
crazyconst<A, int> x;
void doStuff()
{
// Gettin' stuff done
x = 5; // OK
}
};
int main(int argc, char** argv)
{
A a;
int b = a.x;
int c = a.x(); // also works
}
dGVtcGxhdGU8dHlwZW5hbWUgRnJpZW5kLCB0eXBlbmFtZSBGaWVsZFR5cGU+CmNsYXNzIGNyYXp5Y29uc3QKewogICAgc3RydWN0IGlkZW50aXR5IHsgdHlwZWRlZiBGcmllbmQgdHlwZTsgfTsKICAgIEZpZWxkVHlwZSB2YWx1ZTsKICAgIGZyaWVuZCBjbGFzcyBpZGVudGl0eTo6dHlwZTsKICAgIEZpZWxkVHlwZSYgb3BlcmF0b3I9KGNvbnN0IEZpZWxkVHlwZSYgbmV3VmFsdWUpIHsgcmV0dXJuIHZhbHVlID0gbmV3VmFsdWU7IH0KcHVibGljOgogICAgb3BlcmF0b3IgRmllbGRUeXBlKHZvaWQpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CiAgICBGaWVsZFR5cGUgb3BlcmF0b3IoKSh2b2lkKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQp9OwoKY2xhc3MgQQp7CnB1YmxpYzoKICAgIGNyYXp5Y29uc3Q8QSwgaW50PiB4OwoKICAgIHZvaWQgZG9TdHVmZigpCiAgICB7CiAgICAgICAgLy8gR2V0dGluJyBzdHVmZiBkb25lCiAgICAgICAgeCA9IDU7IC8vIE9LCiAgICB9Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCnsKICAgIEEgYTsKICAgIGludCBiID0gYS54OwogICAgaW50IGMgPSBhLngoKTsgLy8gYWxzbyB3b3Jrcwp9