Я создал частный API, который предполагает, что адрес первого объекта-члена в классе будет таким же, как у указателя this класса ... таким образом, объект-член может тривиально получить указатель на объект, который он является членом, без необходимости явно хранить указатель.
Учитывая, что я хочу убедиться, что контейнерный класс не будет наследоваться от какого-либо суперкласса, не будет иметь никаких виртуальных методов, и что объект-член, который выполняет этот трюк, будет первым объявленным объектом-членом, это предположение считается действительным для любого компилятора C ++, или мне нужно использовать оператор offsetof () (или аналогичный), чтобы гарантировать правильность?
Другими словами, приведенный ниже код выполняет то, что я ожидаю от g ++, но будет ли он работать везде?
class MyContainer
{
public:
MyContainer() {}
~MyContainer() {} // non-virtual dtor
private:
class MyContained
{
public:
MyContained() {}
~MyContained() {}
// Given that the only place Contained objects are declared is m_contained
// (below), will this work as expected on any C++ compiler?
MyContainer * GetPointerToMyContainer()
{
return reinterpret_cast<MyContainer *>(this);
}
};
MyContained m_contained; // MUST BE FIRST MEMBER ITEM DECLARED IN MyContainer
int m_foo; // other member items may be declared after m_contained
float m_bar;
};