Здравствуйте, so5team, Вы писали:
S>Так ведь указатель на член -- это же не смещение. Т.е. смещение для одного и того же члена может быть разным в зависимости от объекта, к которому затем этот указатель применяется:
Я немного про другое. Указатель на поле перевести в смещение. Что бы можно было оперировать идентификатором поля (числом), а не этим костылём под название указатель на член класса.
Типа такого:
template<class M,class T> int get_ofs(M T::* p) { return (int)(char*)&(((T*)0)->*p); }
Что бы не писать вручную
#include <iostream>
template<class T>struct get_base_type;
template<class M,class T> struct get_base_type<M T::*> { typedef T base; typedef M value; };
template<class T,T t>struct get_id;
#define DECL_ID(mp,v) template<> struct get_id<decltype(&mp),&mp> { \
enum { id=v }; \
typedef decltype(&mp) type; \
typedef get_base_type<type>::base base; \
typedef get_base_type<type>::value value; \
};
#define GET_ID(mp) (get_id<decltype(&mp),&mp>::id)
struct A {
int x,y; double z;
};
DECL_ID(A::x,1)
DECL_ID(A::y,2)
DECL_ID(A::z,3)
int main(int argc, char const *argv[]) {
std::cout
<<"A::x="<<GET_ID(A::x)<<"\n"
<<"A::y="<<GET_ID(A::y)<<"\n"
<<"A::z="<<GET_ID(A::z)<<"\n"
;return 0;
}