Вопрос. : < /h3>
Есть ли способ получить, с компиляцией, смещение указателя на данные члена: < /p>
- не полагается на неопределенное поведение (вещи)
Код: Выделить всё
nullptr - Работает над последней версией GCC (The GCC Trunk в компиляторе Explorer)
- Работает одинаково как смещение (или аналогично, как и предлагаемый код).
Не стандартные типы < /li>
Совместимость MSVC. (Это может быть хорошо, но необязательно) < /li>
Имея особый случай для конкретного компилятора < /li>
< /ul>
Проблема: < /h3>
С версией GCC багажника, следующий трюк (Hack) не работает: < /p>
Код: Выделить всё
#include
#include
namespace detail
{
// The union stuff is for CLang to avoid creating warnings
template
struct offsetof_ptr_helper
{
union helper_t { int i = 0; T value; };
static constexpr helper_t v = {};
static constexpr size_t sz = sizeof
(uint8_t[
(uint8_t *)&(v.value.*MPtr) -
(uint8_t *)&v.value
]);
};
}
template
static constexpr size_t offsetof_ptr()
{
return detail::offsetofptr_helper::sz;
}
size_t f()
{
struct X { char c[10]; int a; };
return offsetof_ptr();
}
< /code>
Чтобы быть ясным, это взлом с использованием функций C ++ 98, и это не очень удивление, что его поддержка удаляется новейшими компиляторами. Он работает на Clang (используя -std = gnu ++ 17 Подробнее здесь: https://stackoverflow.com/questions/500 ... ember-data
Мобильная версия