Цитата(xvr @ 14.9.2015, 16:04 ) | | Это правильная реализация |
- правильная всмысле теперь, когда я добавил инициацию m_sender в конструкторе функтора?
Полный код тот же самый + изменения в функторах - добавлен конструктор, даже в тех, что должны вызываться по умолчанию. ( среда VS 2008 , машина Win8.1 x64, тестовое приложение 32 bit) -
| Код |
// sdsd.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
//Вызываются по-дефолту, если enabler и/или visible функтор не указаны template<typename ClassName> struct IsEnabled { ClassName *m_sender; IsEnabled(ClassName * name):m_sender(name){} bool operator()(void) { return true;} };
template<typename ClassName> struct IsVisible { ClassName *m_sender; IsVisible(ClassName * name):m_sender(name){} bool operator()(void) { return true;} };
template<typename ClassName, bool (ClassName::*enabler)()> struct Enabler { Enabler(ClassName * name){m_sender = name;} ClassName *m_sender; bool operator()(void) { return ((*m_sender).*enabler)();} };
template<typename ClassName, bool (ClassName::*visible)()> struct Visible { Visible(ClassName * name):m_sender(name){} ClassName *m_sender; bool operator()(void) { return ((*m_sender).*visible)();} };
template<typename ClassName,typename Type, Type (ClassName::*getter)()> struct Getter { Getter(ClassName * name):m_sender(name){} ClassName * m_sender; Type operator()(){ return ((*m_sender).*getter)();} };
template<typename ClassName,typename Type,void (ClassName::*setter)(Type )> struct Setter { Setter(ClassName * name):m_sender(name){} ClassName *m_sender; void operator ()(Type val) { ((*m_sender).*setter)(val); } Type m_val; };
template<typename ClassName,typename GetterFunctor, typename SetterFunctor,typename EnableFunctor = IsEnabled<ClassName>, typename VisibleFunctor = IsVisible<ClassName>> class CProperty { public: GetterFunctor m_getter; SetterFunctor m_setter; EnableFunctor m_enabler; VisibleFunctor m_visible;
CProperty():m_setter(this),m_getter(this),m_enabler(this),m_visible(this) {
}
bool getValue() { return m_getter(); } void setValue(bool val) { m_setter(val); }
bool isEnabled() { return m_enabler(); }
bool isVisible() { return m_visible(); } };
class test { public:
test() { } void initProps() { CProperty<test,Getter<test,bool,&test::getVal>,Setter<test,bool,&test::setVal>,Enabler<test,&test::enabler>,Visible<test,&test::visible>> prop; prop.getValue(); prop.isEnabled(); prop.isVisible(); prop.setValue(false); } bool getVal() { return true; } void setVal(bool b) { } bool enabler() { return true; } bool visible() { return true; } };
int _tmain(int argc, _TCHAR* argv[]) { test s; s.initProps(); return 0; }
|
Если закоментировать все конструкторы и убрать инициализацию из CProperty конструктора, тогда все ок, а иначе падает оптимизатор.
|