ПРИМЕЧАНИЕ. Первоначально этот вопрос задавался еще в 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;
Person::age
, не имея экземпляраPerson
- person Seth Carnegie   schedule 15.01.2012Person::age
? - person Oliver Charlesworth   schedule 15.01.2012typedef int Person::age_t;
? - person greatwolf   schedule 15.01.2012sizeof(reinterpret_cast<Person*>(0) -> age)
Я неправильно понял вопрос, @SethCarnegie? - person Aaron McDaid   schedule 16.01.2012offsetof
. Однако предпочитайте ответ MSN, потому что способoffsetof
имеет неопределенное поведение. - person Seth Carnegie   schedule 16.01.2012