Re[21]: offsetof() без UB
От: kov_serg Россия  
Дата: 27.03.25 13:23
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, kov_serg, Вы писали:


_>>
_>>#include <iostream>

_>>struct A { int a; };
_>>struct B : virtual A { int b; };
_>>struct C : virtual A { int c; };
_>>struct D : B,C { int d; };

_>>template<class T> T* get_instance() { static T t[1]; return t; }
_>>template<class T,auto m> size_t offset() {
_>>    T *t=get_instance<T>(); return (char*)&(t->*m)-(char*)t;
_>>}

_>>int main(int argc,char **argv) {
_>>    std::cout<< "b:" << offset<D,&D::b>() << std::endl;
_>>    std::cout<< "c:" << offset<D,&D::c>() << std::endl;
_>>    std::cout<< "d:" << offset<D,&D::d>() << std::endl;
_>>    std::cout<< "a:" << offset<D,&D::a>() << std::endl;
_>>    return 0;
_>>}
_>>


R>Ну вот, без UB, но компайл тайм сразу пошёл погулять лесом. И для классов без дефолтных конструкторов это уже не работает. И для "тяжёлых" классов применять это уже стрёмно. А вдруг, класс в дефолтном конструкторе нажимает на кнопку уничтожения Вселенной?


R>И что ты хочешь продемонстрировать этим примером?

То что в C++ нет указателя &D::a вместо используется &A::a. Вот нахрена так было делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.