Здравствуйте, 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