सी ++ में मेटाप्रोग्रामिंग के कई उदाहरण देखने के बाद जो कक्षाओं के गुणों (जैसे knowing if a type is a specialization of a template) की पहचान कर सकते हैं, या यह जानकर कि कक्षा में दिए गए नेस्टेड प्रकार को शामिल किया गया हो; लेकिन मैं सोच रहा था कि परीक्षण या विशेषता लिखना संभव था जो पिछले एक के विपरीत को निर्धारित करता है - यह जांचने के लिए कि Type
class
या struct
के भीतर घोंसला है या नहीं।सी ++ - पता है कि एक प्रकार/वर्ग घोंसला है या नहीं?
दूसरे शब्दों में, मैं निम्नलिखित स्यूडोकोड के बराबर की तलाश में हूँ:
template <typename Type> struct is_nested {
enum { value = {__some magic__} };
};
typedef int type1;
struct Something { typedef int internal_type; };
typedef Something::internal_type type2;
//...later, likely at a different scope
is_nested<int>::value; // yields false
is_nested< std::vector<int>::iterator >::value; // yields true
is_nested<type1>::value; // yields false
is_nested<type2>::value; // yields true
मैं जानता हूँ कि मैं sizeof
का उपयोग हां/नहीं परीक्षण लागू करने के लिए कर सकते हैं और मुझे लगता है Type
उन परीक्षण का हिस्सा है, लेकिन मैं यह नहीं समझ सकता कि परीक्षण में किसी भी प्रकार के "किसी भी व्यवहार्य प्रकार" को कैसे प्लग करें ताकि मैं Anytype::Type
जैसी अभिव्यक्ति बना सकूं।
template struct is_nested { typedef char yes; typedef struct { char u[2]; } no; // Herein lies the problem ???? static yes test(char [ sizeof(Anytype::Type) ]) ; ???? static no test(...); public: enum { value = sizeof(test(0)) == sizeof(char) }; };
(ध्यान दें कि मुझे परवाह नहीं है और न ही (करने के लिए) पता क्या प्रकार Type
में नेस्ट किया जाएगा बर्दाश्त कर सकते हैं, यह सब मायने रखती है अगर यह कुछ या नहीं में नीडिंत है दूसरे शब्दों में। , इस विशेषता केवलType
पर निर्भर होना चाहिए।)
मैं एक सी के लिए देख रहा हूँ ++ समाधान उस में हो सी ++ 11 या सी ++ 03 है, लेकिन पहले मामले में मैं इसे और अधिक अगर यह स्वागत करेंगे backportable था। और टेम्पलेट्स प्रकार, नहीं नाम के साथ काम करते हैं -
समस्या का समाधान करने के लिए क्या समस्या है? –
मैं ज्यादातर 'एन ++ में टाइपएफ़ एनम्स का अनुकूलन] [http://stackoverflow.com/a/11856721/399580) को सुधारने के तरीके पर सिद्धांत कर रहा हूं,' एनम 'के लिए रिलेशनल ऑपरेटरों को अक्षम करके जो अंदर घोंसला है structs; यह उस समस्या से निपटने के लिए अध्ययन कर रहे दो दृष्टिकोणों में से एक है। –