NOTE: This question was originally asked way back in 2012. Before the decltype
specifier was fully implemented by any major compilers. You should not be looking at this code unless you only have access to C++03. All major C++11 compliant compilers now support decltype
.
Is there an easy way to retrieve the type of a member?
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);
}
I am actually doing this (ie being slightly lazy):
#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;
But rather than have to force the user to specify the type of the member I want to the compiler to generate it pragmatically.
#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;
C++ classes have their own members. These members include variables (including other structures and classes), functions (specific identifiers or overloaded operators) known as methods, constructors and destructors.
The decltype type specifier yields the type of a specified expression. The decltype type specifier, together with the auto keyword, is useful primarily to developers who write template libraries. Use auto and decltype to declare a function template whose return type depends on the types of its template arguments.
You should use decltype when you want a new variable with precisely the same type as the original variable. You should use auto when you want to assign the value of some expression to a new variable and you want or need its type to be deduced.
template <class T, class M> M get_member_type(M T:: *);
#define GET_TYPE_OF(mem) decltype(get_member_type(mem))
Is the C++11 way. It requires you to use &Person::age
instead of Person::age
, although you could easily adjust the macro to make the ampersand implicit.
In C++2003 it can't be done directly but you can delegate to a function template which deduces the type:
template <typename T, typename S>
void deduce_member_type(T S::* member) {
...
}
int main() {
deduce_member_type(&Person::age);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With