Получение типа члена

ПРИМЕЧАНИЕ : Этот вопрос был первоначально задан еще в 2012 году. До того, как спецификатор decltype был полностью реализован любыми крупными компиляторами . Вам не следует смотреть на этот код, если у вас нет доступа только к C ++ 03. Все основные компиляторы, совместимые с C ++ 11, теперь поддерживают decltype .

Есть ли простой способ получить тип члена?
В C ++ 03

struct Person
{
    std::string name;
    int         age;
    double      salary;
};

int main()
{
    std::vector<Person>     people; //  get a vector of people.

    std::vector<GET_TYPE_OF(Person::age)>   ages;

    ages.push_back(people[0].age);
    ages.push_back(people[10].age);
    ages.push_back(people[13].age);

}

я на самом деле делаю это (то есть немного ленив):

#define BuildType(className, member, type)                                 \
        struct className ## member: TypeBase<className, type>              \
        {                                                                  \
            className ## member()                                          \
                : TypeBase<className, type>(#member, &className::member)   \
            {}                                                             \
        }

BuildType(Person, name,     std::string);
BuildType(Person, age,      int);
BuildType(Person, salary,   double);
typedef boost::mpl::vector<Personname, Personage, Personsalary> FunckyMTPMap;

Но вместо того, чтобы заставлять пользователя указывать тип члена, я хочу, чтобы компилятор сгенерировал его прагматически.

#define BuildType(className, member)                                                  \
struct className ## member: TypeBase<className, TYPE_OF(className ## member)>         \
{                                                                                     \
   className ## member()                                                              \
      : TypeBase<className, TYPE_OF(className ## member)>(#member, &className::member)\
   {}                                                                                 \
}
BuildType(Person, name);
BuildType(Person, age);
BuildType(Person, salary);
typedef boost::mpl::vector<Personname, Personage, Personsalary> FunckyMTPMap;
12
задан Martin York 13 February 2018 в 18:59
поделиться