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

_>>Да допустимо. При условии что тип d приводится к A а потом применяется указатель на поле класса A.

R>Не получается у меня что-то цепочка рассуждений, которая могла бы тебя переубедить. Я ещё подумаю.

Пока думаешь. Я говорю примерно про такое
template<class> struct struct_member_types;
template<class T, class F> struct struct_member_types<F T::*> {
    using struct_t=T;
    using member_t=F;
};
template<class T>using struct_type_t=typename struct_member_types<T>::struct_t;
template<class T>using member_type_t=typename struct_member_types<T>::member_t;

template<auto field> struct fptr {
    using T = struct_type_t<decltype(field)>;
    using F = member_type_t<decltype(field)>;
    typedef F* (*type)(T*);
    static F* value(T* t) { return &(t->*field); }
};
template<auto m> inline constexpr typename fptr<m>::type ptr_to = fptr<m>::value;

//------------------------------------------------------------------------------

#include <stdio.h>
struct A { int a=101; };
struct B : virtual A { int b=102; };
struct C : virtual A { int c=103; };
struct D : B,C { int d=104; };

int main(int argc, char **argv) {
    D d[1];    
    auto p=ptr_to<&D::a>;
    printf("p=%p, *p=%d\n",p,*p(d));
    return 0;
}
p=0x40082f, *p=101
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.