मुझे एक समस्या है जहां मुझे दो प्रकार के सामान्य पूर्वजों (एक या शून्य आधार वर्गों के साथ) की खोज करने की आवश्यकता है यदि यह मौजूद है। क्या इस समस्या को हल करने के लिए एक प्रकार का गुण बनाना संभव है? कोड में:संकलन समय पर, एक विरासत पेड़ की जड़ कैसे दो प्रकार के लिए आम है, यदि कोई मौजूद है?
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
को देखते हुए निम्नलिखित प्रकार:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
निम्नलिखित प्रकार में परिणाम होगा:
closest_common_ancestor<root, child1>::type == root
closest_common_ancestor<child1, child2>::type == root
closest_common_ancestor<child3, child1>::type == root
closest_common_ancestor<child3, child2>::type == child2
closest_common_ancestor<unrelated, child1>::type == error
मेरा मानना है कि मैं अगर मैं क्या एक निरीक्षण कर सकते हैं इस समस्या को हल कर सकते हैं प्रकार शून्य या एक बेस क्लास है, और यदि ऐसा है, तो उस प्रकार का नाम। क्या यह संभव है?
आप बेस क्लास का निरीक्षण नहीं कर सकते हैं। जब तक कि आप अपनी प्रत्येक कक्षा में मेटा जानकारी मैन्युअल रूप से नहीं जोड़ते। –
ध्यान दें कि प्रत्यक्ष संबंध के लिए यह पहले से ही संभव है ('is_base_of' को मूल सी ++ 03 ब्लॉक के संदर्भ में कार्यान्वित किया जा सकता है) –
यदि 2 जड़ें' root1' और 'root2', और' child1', 'child2' वारिस हैं उनमें से दोनों ('struct child1: root1, root2 {};'), यह 'closest_common_ancestor' के लिए संदिग्ध होगा जो वापस आना है। – kennytm