मैंने भाग्य के साथ इसे गुगल करने की कोशिश की, इसलिए मैं यहां कोशिश कर रहा हूं।सी ++ पुनरावर्ती नेस्टेड प्रकार और नाम इंजेक्शन
मेरे पास कुछ कक्षाएं हैं, जिनमें से प्रत्येक सदस्य struct foo
को परिभाषित करता है। यह सदस्य प्रकार foo
स्वयं को पूर्व वर्गों में से एक से प्राप्त कर सकता है, इसलिए सदस्य प्रकार foo
स्वयं प्राप्त कर सकता है।
मैं टेम्पलेट metaprogramming का उपयोग कर (देखें नीचे) नेस्ट foo
प्रकार उपयोग करना चाहते हैं, लेकिन C++ नाम इंजेक्शन, समस्याओं का परिचय के रूप में ऊपरी foo
प्रकार का नाम कम foo
प्रकार में इंजेक्ट किया जाता है, और ऊपरी एक संकल्प लिया हो जाता है जब मैं चाहता हूँ निचले भाग तक पहुंचने के लिए, A::foo::foo
का उपयोग करके कहें।
#include <type_traits>
struct A;
struct B;
struct A {
struct foo;
};
struct B {
struct foo;
};
struct A::foo : B { };
struct B::foo : A { };
// handy c++11 shorthand
template<class T>
using foo = typename T::foo;
static_assert(std::is_same< foo< foo<A> >, foo<B> >::value,
"this should not fail (but it does)");
static_assert(std::is_same< foo< foo<A> >, foo<A> >::value,
"this should fail (but it does not)");
FYI करें, मैं समारोह डेरिवेटिव को लागू कर रहा हूँ, foo
व्युत्पन्न प्रकार है:
यहाँ एक उदाहरण है। उपर्युक्त स्थिति उदा। पाप/कॉस के साथ
टीएलडीआर: मैं foo<foo<A>>
foo<B>
, foo<A>
पर कैसे प्राप्त करूं?
धन्यवाद!
मेरे मन में कुछ इसी तरह की थी, लेकिन एक तरह से उम्मीद कर रही थी मैं एक व्युत्पन्न प्रकार के लिए सदस्य आधार प्रकार परिभाषित करने ... धन्यवाद एक बहुत वैसे भी से बचने के सकता है! – max
@MaximeTournier जैसा कि मैंने कहा था: यदि अड्डों की सूची तय की गई है, तो आप उन्हें स्वचालित रूप से संभाल सकते हैं। कई विरासत के चेहरे में यह बहुत अजीब हो जाता है। – pmr
समझ गया, लेकिन अड्डों की सूची दुख की बात नहीं है: -/ – max