Сообщение Re[20]: offsetof() без UB от 27.03.2025 13:10
Изменено 27.03.2025 13:13 rg45
Re[20]: offsetof() без UB
Здравствуйте, kov_serg, Вы писали:
_>
Ну вот, без UB, но компайл тайм сразу пошёл погулять лесом.
И что ты хочешь продемонстрировать этим примером?
_>
_>#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;
_>}
_>
Ну вот, без UB, но компайл тайм сразу пошёл погулять лесом.
И что ты хочешь продемонстрировать этим примером?
Re[20]: offsetof() без UB
Здравствуйте, kov_serg, Вы писали:
_>
Ну вот, без UB, но компайл тайм сразу пошёл погулять лесом. И для классов без дефолтных конструкторов это уже не работает. И для "тяжёлых" классов применять это уже стрёмно.
И что ты хочешь продемонстрировать этим примером?
_>
_>#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;
_>}
_>
Ну вот, без UB, но компайл тайм сразу пошёл погулять лесом. И для классов без дефолтных конструкторов это уже не работает. И для "тяжёлых" классов применять это уже стрёмно.
И что ты хочешь продемонстрировать этим примером?