NOTA: Esta pregunta se realizó originalmente en el año 2012. Antes de que el especificador decltype
fuera implementado por completo por cualquier compilador importante. No debería mirar este código a menos que solo tenga acceso a C++ 03. Todos los principales compiladores que cumplen con C++ 11 ahora son compatibles con decltype
.Obteniendo el tipo de miembro
¿Hay alguna manera fácil de recuperar el tipo de miembro?
En 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);
}
De hecho, estoy haciendo esto (es decir, ser un poco perezoso):
#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;
Pero en lugar de tener que forzar al usuario a especificar el tipo del miembro quiero al compilador para generarlo pragmáticamente.
#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;
No creo que C++ le permita siquiera hablar de 'Persona :: edad' sin tener una instancia de' Persona' –
@SethCarnegie: Si eso es cierto (y creo que puede ser), es algo molesto. ¿Cómo se descubre el tamaño de 'Persona :: edad'? –
¿qué tal crear algo así como 'typedef int Person :: age_t;'? – greatwolf