2012-01-14 19 views
10

नोट: इस प्रश्न को मूल रूप से 2012 में वापस पूछा गया था। decltype विनिर्देशक किसी भी प्रमुख कंपाइलर्स द्वारा पूरी तरह लागू किया गया था। आपको इस कोड को तब तक नहीं देखना चाहिए जब तक कि आपके पास केवल C++ 03 तक पहुंच न हो। सभी प्रमुख सी ++ 11 अनुपालन कंपाइलर्स अब decltype का समर्थन करते हैं।सदस्य का प्रकार

क्या सदस्य के प्रकार को पुनर्प्राप्त करने का कोई आसान तरीका है?
में सी ++ 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

मुझे नहीं लगता कि सी ++ आपको 'व्यक्ति' आयु 'के बारे में बात करने की अनुमति देता है, बिना किसी व्यक्ति' –

+0

@ सेठ कार्नेगी: यदि यह सच है (और मुझे लगता है कि यह हो सकता है), तो यह कुछ हद तक परेशान है। व्यक्ति 'व्यक्ति :: आयु' के आकार को कैसे खोजता है? –

+0

'typedef int person :: age_t; 'जैसे कुछ बनाने के बारे में क्या? उदाहरण के बिना – greatwolf

उत्तर

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

#define GET_TYPE_OF(mem) decltype(get_member_type(mem)) 

सी ++ 11 रास्ता नहीं है। यह आपको Person::age के बजाय &Person::age का उपयोग करने की आवश्यकता है, हालांकि आप एम्पर्सेंड को अंतर्निहित बनाने के लिए आसानी से मैक्रो समायोजित कर सकते हैं।

+0

स्वीट, यह काम करता है (कम से कम मेरे लिए) –

5

सी ++ 2003 में यह सीधे नहीं किया जा सकता है, लेकिन आप एक समारोह टेम्पलेट किस प्रकार deduces प्रतिनिधि कर सकते हैं:

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

int main() { 
    deduce_member_type(&Person::age); 
} 
1

अपने उदाहरण में जब से तुम को बढ़ावा देने का उपयोग मैं बढ़ावा से typeof का उपयोग करेंगे ।

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

इसके बारे में सी ++ 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 के साथ एक उचित लोगों वेक्टर बनाने की जरूरत के साथ आप प्रदान करता है काम करने के लिए उदाहरण।

जीसीसी में टाइपफ़ोफ़ या टाइप एक ही काम कर रहा है।

एक साइड नोट के रूप में। उदाहरण के लिए आपने दिया है कि यदि आप उपरोक्त में से कोई भी आपके लिए प्रासंगिक नहीं है तो आप केवल संरचना में प्रकारों को परिभाषित कर सकते हैं।

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

तो std :: वेक्टर < व्यक्ति :: agetype> उम्र का उपयोग करें;

संबंधित मुद्दे