【发布时间】:2012-02-10 13:53:17
【问题描述】:
注意:这个问题最初是在 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;
【问题讨论】:
-
如果没有
Person的实例,我认为C++ 甚至不能让你谈论Person::age -
@SethCarnegie:如果这是真的(我认为可能是),那就有点烦人了。如何发现
Person::age的大小? -
创建类似
typedef int Person::age_t;的东西怎么样? -
sizeof 没有实例。试试看:
sizeof(reinterpret_cast<Person*>(0) -> age)@SethCarnegie 我误解了这个问题吗? -
@AaronMcDaid 我今天在使用
offsetof时也想到了这一点。不过更喜欢 MSN 的答案,因为offsetof方式具有未定义的行为
标签: c++ templates template-meta-programming c++03