есть задача обращаться к полям класса по их имени, т.е. зная строку. Это строка, приходит, парсится потом собственно идет само обращение.
Каждое поля класса это класс, интерфейс которого нам известен.
Придумал вот такую функцию, которую вызываю из констактора и заполняю мап со смещениями для всех полей:
bool ORMtableBase::FillFiledsMap(FieldsList& fields, const ORMtableBase* _this)
{
size_t Finish = _this->GetSize(); // size of main class
size_t Start = _this->GetFirstField(); // offset to first field
while(Start < Finish)
{
const IORMField* pField =
static_cast<const IORMField*> // common interface for each field
(
static_cast<const void*>
(
(
static_cast<const char*>
(
static_cast<const void*>(_this)
) + Start
)
)
);
fields.insert(std::pair<std::string, FieldInfo>(pField->GetName(), FieldInfo(pField->GetType(), Start))); // sometimes it crashes here
Start += pField->GetSize(); // sizeof(ClassFieldName)
}
return !fields.empty();
}
и все замечательно работает на 32-х машинах, но на 64-х битных возникает крэш, ровно для одного из типов, который возвращает размер 42, а реально смещение до следующего поля 46. Выравниваение во всех проектах стоит 8 байт. Это похоже на проблему выравнивания и можно было ббы написать функцию, которая бы подравнивала такие значения, вот только будет ли это гарантированно правильно во всех компиляторах?
P.S. Все эти извращения потому, что в месте использования нет информации о конечном типе, а есть только интерфейс.