Я работаю над проектом дескриптора типа в C ++ 11. Работа дескриптора типа заключается в том, чтобы знать типы каждого члена класса, его размер и смещение от основания объекта. Я не поддерживаю множественное наследование, а также объекты с виртуальными методами, поэтому сейчас я делаю это намного проще. Цель состоит в том, чтобы иметь возможность сериализации и десериализации объектов с использованием дескриптора.
Обратите внимание, что это любимый проект, который возиться с такими функциями, как шаблоны с переменными параметрами, указатель на члены и другие функции C ++, с которыми я не знаком, поэтому нет необходимости указывать мне что-то вроде boost :: archiving , :)
Способ, которым я на самом деле регистрирую участников, очень похож на способ boost :: python :: class_.
ClassDescriptor fooDesc( "Foo" );
fooDesc.addMember( "a", &Foo:: a );
fooDesc.addMember( "b", &Foo:: b );
// (abridged for clarity) :
template< typename ClassType, typename MemberType >
ClassDescriptor& ClassDescriptor::addMember(
const char* name,
MemberType ClassType::* member
)
{
return addMember< MemberType >( name, reinterpret_cast< size_t >( &(((ClassType*)0)->*member)) );
}
К сожалению, функция указателя на член C ++ не может использоваться со ссылками в C ++, как я узнал ранее на этой неделе: https://stackoverflow.com/a/8336479/1074536,, поэтому я не могу использовать & Foo :: refToAndInt например.
Насколько я вычисляю смещение члена, я не использую смещение макроса, так как мои классы не всегда будут POD.
Так как я не могу использовать указатели на элементы для вычисления смещения ссылок, я решил попробовать:
&(((Foo*)nullptr)->refToAnInt)
но если это было указано в другом потоке переполнения стека, это неопределенное поведение и, очевидно, в LLVM происходит сбой. (
Я бы хотел избежать таких вещей, как смещение предыдущего члена, добавление его размера и последующее вычисление отступов, необходимых для выравнивания моего следующего члена, так как это выглядело бы беспорядочно и подвержено ошибкам
Итак, я не могу использовать оба этих трюка, а offsetof предназначен только для POD. Любое предложение о том, что я мог бы попробовать дальше, кроме моего другого ужасного предложения?
Спасибо!