У меня есть традиционное большое дерево наследования классов (доменные классы), которое реализует собственную информацию о типах классов и реестр.Это делается так, что каждый класс 'вызывает' макрос, подобный этому
class MyClass : public MyParent {
MY_DECLARE_DYNAMIC(MyClass)
...
};
//in .c file:
MY_IMPLEMENT_DYNAMIC(MyClass, MyParent)
В основном эти макросы вставляют статическую функцию, которая является синглтоном Майера, возвращающим указатель на MyClassInfo
, который выглядит следующим образом:
class MyClass : public MyParent {
MyClassInfo* GetClassInfo_() {
static MyClassInfo instance=...;
return &instance;
}
virtual MyClassInfo* GetClassInfo() const;
};
Другая вещь, которая вставляется макросом, - это виртуальная функция для извлечения информации о классе для использования во время выполнения (т. Е. Из некоторого указателя базового типа).
MyClassInfo*
содержит строкуимя класса и некоторый способ получения информации о классе родителей (реализация в настоящее время использует для этого указатель функции).
Теперь эту информацию можно использовать, написав напрямую: MyClass::GetClassInfo_()
или myClass.GetClassInfo()
В реальном случае есть (как вы уже догадались) больше деталей, но я думаю, что этого достаточно, чтобы проиллюстрировать концепцию, за исключением того, что каждый класс может иметь немного больше характеристик, таких как данные (например, значение перечисления).указание, является ли этот конкретный класс устаревшим)
Этот шаблон также хорошо известен из WxWidgets и MFC https://docs.microsoft.com/en-us/previous-versions/ywz9k63y(v=vs.140).
Есть ли у кого-нибудь решение дляизбавиться от этих макросов?Помимо написания всего вручную - например, с использованием шаблонов или виртуального наследования и т. Д. Предпочтительно тот, который не увеличивает размер каждого объекта (больше, чем одна виртуальная функция).