नोट: इस प्रश्न को मूल रूप से 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;
मुझे नहीं लगता कि सी ++ आपको 'व्यक्ति' आयु 'के बारे में बात करने की अनुमति देता है, बिना किसी व्यक्ति' –
@ सेठ कार्नेगी: यदि यह सच है (और मुझे लगता है कि यह हो सकता है), तो यह कुछ हद तक परेशान है। व्यक्ति 'व्यक्ति :: आयु' के आकार को कैसे खोजता है? –
'typedef int person :: age_t; 'जैसे कुछ बनाने के बारे में क्या? उदाहरण के बिना – greatwolf