c++ - 获取成员的类型

标签 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);

}

我实际上正在这样做(即有点懒惰):

#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/

相关文章:

c++ - 从模板函数返回默认构造或无效

c++ - 如何通过 stdio 正确读取文件? C++

c++ - 访问包含 boost::shared_ptr<CustomObj> 的 std::vector -> at() 是否返回共享指针的拷贝?

C++ 简单代码。需要找到重复的相邻单词

c++ - 动态分配内存和取消引用

javascript - dust.js eq 帮助程序无法正常工作

c++ - Visual Studio 中可变参数模板扩展的问题

c++ - 专门用于指针的模板类

c++ - 是否需要 `void_t` 来检查类是否具有具有特定签名的方法?

c++ - 派生类模板化时访问基本成员数据错误