Вот попробовал написать код поддержки так называемых свойств (как в C#).
Есть замечания и предложения по дизайну или ссылки на уже существующие реализации?
Мои собственные замечания:
использование:
1) при использовании парит писать имя класса, которому свойство принадлежит
2) использование this в списке инициализации конструктора не безопасно.
реализация:
1) при множественном наследовании объект GetSet занимает 16 байт вместо положенных 12.
2) operator= не наследуется, поэтому приходится писать дублирующий код в GetSet
Здравствуйте, Undead, Вы писали:
U>Вот попробовал написать код поддержки так называемых свойств (как в C#). U>Есть замечания и предложения по дизайну или ссылки на уже существующие реализации?
— можно сеттеры и геттеры вынести в параметры шаблона
— вместо хранения this объекта в шаблоне использовать смещение от this этого проперти
т.е. само пропертине должно хранить данных, в параметрах шаблона можно все указать,
получишь 1 байт на проперти в целевом классе
-------------------
__declspec(property ...)
а вообще, заканчивайте вы с этими пропертями на С++
Здравствуйте, Undead, Вы писали:
U>Вот попробовал написать код поддержки так называемых свойств (как в C#). U>Есть замечания и предложения по дизайну или ссылки на уже существующие реализации?
Вы писали: V>- можно сеттеры и геттеры вынести в параметры шаблона
Отлично, вынес в параметр шаблона, так намного экономней и красивей.
V>- вместо хранения this объекта в шаблоне использовать смещение от this этого проперти
А вот этого не понял. Можно подробней?
Здравствуйте, Undead, Вы писали:
U>Вы писали: V>>- можно сеттеры и геттеры вынести в параметры шаблона U>Отлично, вынес в параметр шаблона, так намного экономней и красивей.
V>>- вместо хранения this объекта в шаблоне использовать смещение от this этого проперти U>А вот этого не понял. Можно подробней?
да, можно,
есть такая штука в С++ — offsetof, причем, раз это константа, то ты ее можешь тоже как параметр шаблона указать.
а потом, из this инстанса проперти обратно по смещению можешь получить this объекта-парента, и таким образом — не нужно его хранить в экземпляре проперти.
...навороченное может получиться объявление, но тут и макросами разбавить не грех.
Здравствуйте, Shady, Вы писали:
V>>а вообще, заканчивайте вы с этими пропертями на С++ S>а это типа намёк на c#?
вот еще...
просто не такое уж это востребованное качество — доступ к св-вам в стиле OPascal или там VB.
на худой конец, если ОЧЕНЬ хочется, чем не устраивает __declspec(property ...)?, тем более, что он и индексированные проперти поддерживает (а C#, кстати, нет).
Здравствуйте, vdimas, Вы писали:
V>вот еще... V>просто не такое уж это востребованное качество — доступ к св-вам в стиле OPascal или там VB.
Ну почему же, очень удобная фича...
V>на худой конец, если ОЧЕНЬ хочется, чем не устраивает __declspec(property ...)?, тем более, что он и индексированные проперти поддерживает (а C#, кстати, нет).
Ну да, ms specific? Увольте...
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Здравствуйте, vdimas, Вы писали:
V>есть такая штука в С++ — offsetof, причем, раз это константа, то ты ее можешь тоже как параметр шаблона указать. V>а потом, из this инстанса проперти обратно по смещению можешь получить this объекта-парента, и таким образом — не нужно его хранить в экземпляре проперти.
Ошибка: error C2027: use of undefined type 'Temp'
да и в любом случае объявление действительно слишком некрасивое получается.
V>...навороченное может получиться объявление, но тут и макросами разбавить не грех.
Макросы сами по себе грех. Хуже этого только ms specific
Здравствуйте, vdimas, Вы писали:
V>т.е. само пропертине должно хранить данных, в параметрах шаблона можно все указать, V>получишь 1 байт на проперти в целевом классе
А нулевой оверхед слабо сделать?
Здравствуйте, Shady, Вы писали:
S>Здравствуйте, Alexey Chen, Вы писали:
AC>>P.S. AC>>В понедельник опубликую. S>А почему в понедельник? Это так долго...
Это, кстати, решает проблему инициализации всех пропертей (вообще это ub, но работать будет) с которой у автора ошибка.
Можно еще реализовать пропертя без хранения указателя на контейнер, тогда можно поместить в обьеденени какой либо мембер котейнера, и оверхед будет нулевой.
Здравствуйте, Alexey Chen, Вы писали:
AC>Это, кстати, решает проблему инициализации всех пропертей (вообще это ub, но работать будет) с которой у автора ошибка.
Я заметил ошибку, попытался модернуть, но как-то тут с этим туго оказалось
AC>Можно еще реализовать пропертя без хранения указателя на контейнер, тогда можно поместить в обьеденени какой либо мембер котейнера, и оверхед будет нулевой.
Интрузивный подход.
Здравствуйте, vdimas, Вы писали:
V>>>- вместо хранения this объекта в шаблоне использовать смещение от this этого проперти U>>А вот этого не понял. Можно подробней?
V>да, можно, V>есть такая штука в С++ — offsetof, причем, раз это константа, то ты ее можешь тоже как параметр шаблона указать. V>а потом, из this инстанса проперти обратно по смещению можешь получить this объекта-парента, и таким образом — не нужно его хранить в экземпляре проперти.
Странно эта штука местами работает...
V>...навороченное может получиться объявление, но тут и макросами разбавить не грех.
Ну как вариант, набрасал тут ...
Оверхед константный. Если в обьеденение положить каконить мембер, будет нулевой оверхед.
Кстати, вопрос нашим Гуру, так вообще делать можно? А то некоторые компилеры как-то странно ругаются.
Не работает с: Borland C++ (кто бы сомнивался), Gcc 2.95 (компиллер еррор), Sun C++ 5.5 (момбер обьеденения не может иметь оперетор = ).
Работает с: MS C++ 6/7, MWCC 3.x, DMC 8.4x, ICL8, GCC 3.2
Здравствуйте, yxiie, Вы писали:
Y>Здравствуйте, Alexey Chen, Вы писали:
Y>... AC>> DECLARE_PROPERTY(Test,float,a); AC>> DECLARE_PROPERTY(Test,float,b); Y>...
Y>тип в таких конструкциях всегда лучше в конце писать:
Y>
Y>DECLARE_PROPERTY(Test,a,float);
Y>
Y>а то типом может оказаться что-то типа pair<string, long> и будут проблемы
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, yxiie, Вы писали:
AC>
Y>>DECLARE_PROPERTY(Test,a,float);
AC>
Y>>а то типом может оказаться что-то типа pair<string, long> и будут проблемы
AC>Хм, об этом я не подумал. А макрос на этом вообще не сломается? Скажет еще, что неправильное количество аргументов.
ну если в таком виде как сейчас, то конечно сломается, но ведь можно заюзать workaround типа моего
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, yxiie, Вы писали:
Y>>Здравствуйте, Alexey Chen, Вы писали:
Y>>... AC>>> DECLARE_PROPERTY(Test,float,a); AC>>> DECLARE_PROPERTY(Test,float,b); Y>>...
Y>>тип в таких конструкциях всегда лучше в конце писать:
Y>>
Y>>DECLARE_PROPERTY(Test,a,float);
Y>>
Y>>а то типом может оказаться что-то типа pair<string, long> и будут проблемы
__>Почитайте здесь