Предположим, у меня есть такие типы:
Код: Выделить всё
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
Указатель C* можно привести к указателю A* без какой-либо корректировки фактического адреса. Но когда C* преобразуется в B*, значение должно измениться. Я хотел бы гарантировать, что два связанных типа, которые у меня есть, могут быть приведены друг к другу без изменения адреса (т. е. чтобы не было множественного наследования или чтобы базовый класс был первой базой производного класса). Это можно проверить во время выполнения, например. вот так
Код: Выделить всё
assert(size_t(static_cast((C*)0xF000) == 0xF000);
assert(size_t(static_cast((C*)0xF000) != 0xF000);
Это работает. Но эта информация известна во время компиляции, поэтому я ищу способ сделать утверждение во время компиляции. Очевидные способы преобразования приведенного выше в статическое утверждение (например, замена утверждения на BOOST_STATIC_ASSERT дают ошибку «приведение к типу, отличному от целочисленного или перечислимого типа, не может появиться в константном выражении» с g++ 4.2.
Переносимость не слишком важна. Использование расширений gcc или хакерских трюков с шаблонами вполне подойдет.
Обновление: Обнаружено, что почти тот же вопрос задавался ранее: C++, статически определять базовые классы с разными адресами? Использование offsetof() также является единственным полезным предложением.
Подробнее здесь:
https://stackoverflow.com/questions/553 ... is-trivial