Вам нужно будет так или иначе пометить классы.Выберите способ, которым вам удобно, свойство или какой-то тип целочисленного члена с перечислением.Кто бы ни делал подклассы, должен будет следовать вашему соглашению, чтобы заставить это работать.
Все остальные ответы здесь будут некоторым вариантом этого.
Любой ответ, который использует sizeof, не может гарантировать, что это будет работать между платформами, компиляторами или даже классами на той же платформе и компиляторе,из-за легкой возможности размещения нового члена в выравнивании членов класса по умолчанию, где размеры sizeof могут легко оказаться одинаковыми для подкласса.
Фон:
Как указано в вашем коде и вопросе, все это просто простой и базовый код C и C ++, и полностью решается во время компиляции.Компилятор скажет вам, существует ли член или нет.После компиляции он представляет собой набор эффективного, безымянного машинного кода без подсказок или помощи для такого рода вещей.
Любое имя, которое вы используете для функции или члена данных, фактически исчезает, как вы это знаете иПосмотрите его там после компиляции, и нет способа найти какой-либо элемент по имени.Каждый элемент данных известен только его числовым смещением от вершины класса или структуры.
Системы, подобные .Net, Java и другим, предназначены для отражения, то есть способности запоминать членов класса по имени,где вы можете найти их во время выполнения, когда ваша программа запущена.
Шаблоны в C ++, если только смешанный режим C ++ на чем-то похожем на .Net, также не разрешен во время компиляции, и имена также все пропадут,поэтому шаблоны сами по себе ничего не покупают.
Языки, подобные Objective-C, также написаны так, что они не обязательно перестают работать, если отсутствуют определенные типы специальных членов, аналогично тому, что вы спрашиваете, но под прикрытием его использованиемного поддержки кода и управления во время выполнения для независимого отслеживания, когда сама функция и ее код все еще не осведомлены и полагаются на другой код, чтобы сообщить им, существует ли член или нет на нулевом члене.
В чистом C или C ++ вам нужно будет просто создать свою собственную систему и быть грамотнымЯ про динамическое отслеживание, что делает что.Вы можете создавать перечисления, списки или словари строк имен.Это то, что обычно делается, вы просто должны оставить подсказки для себя.Класс не может быть скомпилирован способом, который дает неявную видимость будущим подклассам по определению, без использования какой-либо формы, если RTTI.
По этой самой причине обычно помещают член типа в класс, что можетбыть простым перечислением.Я бы не стал рассчитывать на размеры или что-то, что могло бы зависеть от платформы.