Можно ли в VS2010 использовать static_assert для проверки предположения о смещении переменной от начала класса?

Вот упрощенный пример:

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!");

Это слишком амбициозно для текущей версии компилятора?


person Coder_Dan    schedule 03.07.2012    source источник
comment
Ничто не имеет члена m_array. Вы имеете в виду ((B*)nullptr)->m_bool ?   -  person Tim    schedule 03.07.2012
comment
Спасибо, Тим - это было упущение при переводе моего реального кода во что-то, что, как я надеялся, могло быть более читабельным. Я исправил это сейчас.   -  person Coder_Dan    schedule 03.07.2012
comment
Достаточно ли хорош стандартный макрос offsetof?   -  person    schedule 03.07.2012
comment
Отличный совет, @hvd! Работает следующий код: static_assert (offsetof (B‹T›, m_class) == OFFSET, Ошибка 'm_class' расположена неправильно!);   -  person Coder_Dan    schedule 03.07.2012
comment
С какой стати ты хочешь это сделать? Я предполагаю, что вы в конечном итоге используете reinterpret_cast, и все, что произойдет, это то, что где-то через два года ваш код каким-то непонятным образом сломается, и потребуется две недели, чтобы отследить этот дизайн.   -  person Mark B    schedule 03.07.2012
comment
@Mark B - static_assert предназначен для того, чтобы код не ломался непонятным образом. Все сводится к внутреннему руководству по кодированию, которое предполагает, что классы-шаблоны должны использовать базовый класс без шаблонов для любой функциональности, не требующей параметра шаблона. Элемент «MyClass» в моем случае имеет базовый класс без шаблона, который может использоваться классом «A» для определенных средств доступа, но класс «A» сам не может содержать «MyClass», потому что он зависит от шаблона параметр. Этот код критичен к производительности. Надеюсь, это немного объясняет.   -  person Coder_Dan    schedule 03.07.2012
comment
@hvd offsetof действительно полезен, en.wikipedia.org/wiki/Offsetof, возможно, вы можете включить его в ответ?   -  person aka.nice    schedule 16.08.2012
comment
@ aka.nice К сожалению, мое предложение здесь было неправильным. offsetof требуется структура POD. Наличие базового класса означает, что класс не является агрегатом, а класс, не являющийся агрегатом, означает, что он не является структурой POD. offsetof может работать здесь на практике на определенных компиляторах, но не определено в стандартном C++.   -  person    schedule 16.08.2012
comment
@hvd Хорошо, я использовал его со структурой POD, такой как мистер Журден. Спасибо, я выучил сленг stackoverflow.com/ вопросы/146452/какие-есть-под-типы-в-с   -  person aka.nice    schedule 16.08.2012