Получить адрес не POD-объекта из элемента данных, который является вложенным классом одноразового использования
Я начну с некоторого кода:
class myNonPODClass
{
public:
virtual ~myNonPODClass() {}
class
{
public:
myNonPODClass* GetContainer()
{
return (myNonPODClass*)((int8_t*)(this) - offsetof(myNonPODClass, member));
}
} member;
};
Очевидно, это надуманный пример. Код компилируется нормально, но меня беспокоит "Смещение не-POD типа myNonPODClass". Есть ли лучший способ сделать по существу то же самое БЕЗ необходимости передавать указатель myNonPODClass в конструктор вложенных анонимных классов (или аналогичный)? "участник" должен быть готов к работе без какой-либо инициализации. Является ли это возможным? Спасибо!
На случай, если вам интересно, для чего мне это нужно, мой макрос PROPERTY и закомментированный пример pastebin (да, это круто ^^): http://pastebin.com/xnknf39m
1 ответ
Этот код не работает, согласно спецификации C++, по нескольким причинам:
offsetof
требуется тип POD (в C++11 требуется тип стандартного макета). Ваш тип не является, и, следовательно, вызов его приводит к неопределенному поведению.- Преобразование в
int8_t*
и затем к другому типу неопределенное поведение согласно спецификации C++. Вам нужно будет использоватьchar*
, который имеет определенные смягченные правила кастинга.