NOTA: questa domanda è stata originariamente richiesta nel lontano 2012. Prima che lo specificatore decltype
fosse completamente implementato da qualsiasi compilatore principale. Non dovresti guardare questo codice a meno che tu non abbia solo accesso a C++ 03. Tutti i principali compilatori compatibili con C++ 11 ora supportano decltype
.Ottenere il tipo di membro
C'è un modo semplice per recuperare il tipo di un membro?
In 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);
}
Io sto facendo questo (cioè di essere un po 'pigro):
#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;
Ma piuttosto che dover costringere l'utente a specificare il tipo di elemento che voglio al compilatore per generarlo pragmaticamente.
#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;
Non penso che il C++ ti permetta di parlare di 'Person :: age' senza avere un'istanza di' Person' –
@SethCarnegie: Se ciò è vero (e penso che possa essere), è alquanto fastidioso. Come si scopre la dimensione di 'Person :: age'? –
come creare qualcosa come "typedef int Person :: age_t;"? – greatwolf