Информация об изменениях

Сообщение Re[6]: Дурацкий вопрос от 26.11.2024 9:12

Изменено 26.11.2024 9:38 kov_serg

Re[6]: Дурацкий вопрос
Здравствуйте, 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_type;
template<class M,class T> struct get_type<M T::*> { typedef M type; };
template<class T,T t>struct get_id;
#define DECL_ID(mp,v) template<> struct get_id<decltype(&mp),&mp> { enum { id=v }; };
#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;
}
Re[6]: Дурацкий вопрос
Здравствуйте, 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_type;
template<class M,class T> struct get_type<M T::*> { typedef M type; };
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_type<type> base; };
#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;
}