Здравствуйте, _Winnie, Вы писали:
_W>
_W>int main()
_W>{
_W> std::cout <<sizeof(MegaClass) <<"\n"; //empty class
_W> MegaClass mc;
_W> mc.X() = 10;
_W> int i = mc.Y();
_W> std::string s = mc.Sss();
_W> mc.Sss() = "world";
_W> //проверяю в листинге на asm, что компилятор уничтожает лишние вызовы.
_W> Test2 t;
_W> t.I() = 10;
_W> i = t.I();
_W> std::cout <<i;
_W>}
_W>
Да, идея интересная. Только "свойство" превратилось из поля класса в метод, поэтому надо писать пустые скобки. Интересно, что раньше, реализуя "свойство" через поле данных, я перегружал оператор () так, чтобы он возвращал результат Get-метода. Таким образом у меня появлялась возможность вызывать константные методы оригинального поля данных объекта. Например:
//...
const PropT operator () () { return (owner .* Getter)(); }
//...
Теперь же придётся писать два раза скобки, чтобы спросить у строки длину
:
//...
cout << "Length is " << ms.Sss()().length() << endl;
//...