Вот упрощенный пример:
class A
{
enum {OFFSET = 4}; //Due to packing
bool m_bool;
};
template<class T>
class B : public A
{
MyClass<T> m_class;
};
Теперь предположим, что класс A может использовать подмножество функциональных возможностей MyClass через базовый класс MyClass, что я хочу сделать, так это проверить предположение о расположении m_class относительно экземпляра класса A.
Я попробовал следующий код из функции-члена класса B, но он выдает ошибку ("ожидаемое постоянное выражение"):
static_assert ((byte *)nullptr + OFFSET ==
(byte *)&((B<T> *)nullptr)->m_class, "Error 'm_class' incorrectly located!");
Это слишком амбициозно для текущей версии компилятора?
m_array
. Вы имеете в виду((B*)nullptr)->m_bool
? - person Tim   schedule 03.07.2012offsetof
? - person   schedule 03.07.2012reinterpret_cast
, и все, что произойдет, это то, что где-то через два года ваш код каким-то непонятным образом сломается, и потребуется две недели, чтобы отследить этот дизайн. - person Mark B   schedule 03.07.2012offsetof
требуется структура POD. Наличие базового класса означает, что класс не является агрегатом, а класс, не являющийся агрегатом, означает, что он не является структурой POD.offsetof
может работать здесь на практике на определенных компиляторах, но не определено в стандартном C++. - person   schedule 16.08.2012