获取成员的类型

Mar*_*ork 12 c++ templates template-meta-programming c++03

注意:这个问题最初是在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);

}
Run Code Online (Sandbox Code Playgroud)

我实际上是这样做的(即稍微懒惰):

#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;
Run Code Online (Sandbox Code Playgroud)

但是,不必强制用户指定我想要编译器以实用方式生成它的成员的类型.

#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;
Run Code Online (Sandbox Code Playgroud)

MSN*_*MSN 14

template <class T, class M> M get_member_type(M T:: *);

#define GET_TYPE_OF(mem) decltype(get_member_type(mem))
Run Code Online (Sandbox Code Playgroud)

是C++ 11的方式.它需要你使用&Person::age而不是Person::age,虽然你可以轻松地调整宏,使隐含的&符号.

  • 哇,它有效...但我不明白。如何把`&amp;Person::age`变成`age`类型,但是把`&amp;Person::age`应用到`MT:: *`上?`MT:: *` 到底是什么意思或代表什么? (3认同)

Die*_*ühl 5

在C++ 2003中,它无法直接完成,但您可以委托给一个推断类型的函数模板:

template <typename T, typename S>
void deduce_member_type(T S::* member) {
     ...
}

int main() {
    deduce_member_type(&Person::age);
}
Run Code Online (Sandbox Code Playgroud)