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

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

Изменено 26.11.2024 9:50 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_base_type;
template<class M,class T> struct get_base_type<M T::*> { typedef T 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_base_type<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;
}
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_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;
}