Как сделать статическое утверждение, что приведение указателя тривиально?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как сделать статическое утверждение, что приведение указателя тривиально?

Сообщение Anonymous »

Предположим, у меня есть такие типы:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»