注意:这个问题最初是在 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;
最佳答案
template <class T, class M> M get_member_type(M T:: *);
#define GET_TYPE_OF(mem) decltype(get_member_type(mem))
是C++11的方式。它要求您使用 &Person::age
而不是 Person::age
,尽管您可以轻松调整宏以使 & 符号隐含。
关于c++ - 获取成员的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866194/