注意:这个问题最初是在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;
答案 0 :(得分:14)
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
,尽管您可以轻松调整宏以隐含&符号。
答案 1 :(得分:5)
在C ++ 2003中,它不能直接完成,但你可以委托给一个推断出类型的函数模板:
template <typename T, typename S>
void deduce_member_type(T S::* member) {
...
}
int main() {
deduce_member_type(&Person::age);
}
答案 2 :(得分:1)
因为在你的例子中你使用了boost我会使用来自boost的TYPE。
http://www.boost.org/doc/libs/1_35_0/doc/html/typeof.html
它与C ++ 11的decltype非常相似。
http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference 在你的情况下:
std::vector<BOOST_TYPEOF(Person::age) > ages;
您可以比较decltype或BOOST_TYPEOF类型为您提供的typeinfo
#include <typeinfo>
cout << typeid(obj).name() << endl;
你需要制作一个长度> 14的正确人物矢量,以便工作。
gcc的typeof或 typeof 做同样的事情。
作为旁注。对于您给出的示例,您可以在结构中定义类型,而不是上述任何一个都与您相关。
struct Person
{
typedef int agetype;
std::string name;
agetype age;
int salary;
};
然后使用
的std ::矢量&lt; Person :: agetype&gt;年龄;