Получить адрес не 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++, по нескольким причинам:

  1. offsetof требуется тип POD (в C++11 требуется тип стандартного макета). Ваш тип не является, и, следовательно, вызов его приводит к неопределенному поведению.
  2. Преобразование в int8_t* и затем к другому типу неопределенное поведение согласно спецификации C++. Вам нужно будет использовать char*, который имеет определенные смягченные правила кастинга.
Другие вопросы по тегам