Хотелось бы иметь что-то вроде этого:
class Foo {
private:
int bar;
public:
void setBar(int bar);
int getBar() const;
}
class MyDialog : public CDialogImpl<MyDialog> {
BEGIN_MODEL_MAPPING()
MAP_INT_EDITOR(m_editBar, m_model, getBar, setBar);
END_MODEL_MAPPING()
// other methods and message map
private:
Foo * m_model;
CEdit m_editBar;
}
Также было бы здорово, если бы я мог предоставить свои собственные проверки:
MAP_VALIDATED_INT_EDITOR(m_editBar, m_model, getBar, setBar, validateBar)
...
bool validateBar (int value) {
// custom validation
}
Кто-нибудь видел что-то подобное?
P.S. Мне не нравится DDX, потому что он старый и негибкий, и я не могу использовать геттеры и сеттеры.





Связки какао предоставляют именно то, что вы хотите, но они доступны только в слове Mac / Objective-C. GNUstep - его бесплатная версия, но она по-прежнему Objective-C, а не C++.
Однако это может быть хорошим источником вдохновения для создания собственной структуры или хорошей отправной точкой для дальнейших исследований.
Карта DDX - это просто набор операторов if, поэтому вы можете легко написать свой собственный макрос DDX.
#define DDX_MAP_VALIDATED_INT_EDITOR(control, variable, getter, setter, validator)\
if (nCtlID==control.GetDlgCtrlID())\
{\
if (bSaveAndValidate)\
{\
int const value=control.GetDlgItemInt();\
if (validator(value))\
{\
variable->setter(value);\
}\
else\
{\
return false;\
}\
}\
else\
{\
control.SetDlgItemInt(variable->getter());\
}\
}
Это не проверено, но должно работать в соответствии с вашим примером, если вы поместите его в карту DDX. Это должно дать вам представление. Конечно, вы можете извлечь это в функцию, что и делают стандартные макросы DDX: они просто выполняют внешний if, а затем вызывают функцию. Это позволит вам перегрузить функцию для разных типов variable (например, указатель vs ссылка / значение)
Приятно слышать, что это может будет реализовано. «Исследования» с помощью гугла результатов не приносят. Если ответов больше не будет, наверное, придется писать свой фреймворк.