Getting the type of a member

前端 未结 3 1469
鱼传尺愫
鱼传尺愫 2021-01-04 02:24

NOTE: This question was originally asked way back in 2012. Before the decltype specifier was fully implemented by any major compilers. You shou

相关标签:
3条回答
  • 2021-01-04 02:58

    Since in your examples you use boost I'd use TYPEOF from boost.

    http://www.boost.org/doc/libs/1_35_0/doc/html/typeof.html

    it works very similarly to decltype of C++11.

    http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference in your case:

    std::vector<BOOST_TYPEOF(Person::age) > ages;
    

    you can compare the types decltype or BOOST_TYPEOF gives you with typeinfo

    #include <typeinfo>
    cout << typeid(obj).name() << endl;
    

    you need to make a proper people vector with length >14 for the example to work.

    gcc has typeof or typeof doing the same thing.

    As a side note. For the example you gave you could just define the types in the struct instead if none of the above is relevant for you.

    struct Person
    {
      typedef  int agetype;
      std::string name;
      agetype         age;
      int         salary;
    };
    

    then use std::vector< Person::agetype > ages;

    0 讨论(0)
  • 2021-01-04 03:03

    In C++2003 it can't be done directly but you can delegate to a function template which deduces the type:

    template <typename T, typename S>
    void deduce_member_type(T S::* member) {
         ...
    }
    
    int main() {
        deduce_member_type(&Person::age);
    }
    
    0 讨论(0)
  • 2021-01-04 03:06
    template <class T, class M> M get_member_type(M T:: *);
    
    #define GET_TYPE_OF(mem) decltype(get_member_type(mem))
    

    Is the C++11 way. It requires you to use &Person::age instead of Person::age, although you could easily adjust the macro to make the ampersand implicit.

    0 讨论(0)
提交回复
热议问题