क्या मेरे पास निम्न कथन को आसान बनाने का कोई तरीका है? (शायद, boost :: enable_if
का उपयोग करके) ।
मेरे पास एक साधारण वर्ग संरचना है - बेस
आधार वर्ग, < कोड> व्युत्पन्न 1 , derived2
से बीर बेस
।
मेरे पास निम्न कोड है:
<पूर्व> टेम्पलेट & lt; typename Y & gt; संरचना अनुवादक _बेटिनी & lt; बेस, वाई & gt; {टाइप किए गए कुछ some_translator & lt; बेस, वाई & gt; प्रकार; }; टेम्पलेट & lt; typename Y & gt; स्ट्रिप अनुवादक _बेटिनी & lt; Derived1, Y & gt; {टाइप किए गए कुछ some_translator & lt; Derived1, Y & gt; प्रकार; }; टेम्पलेट & lt; typename Y & gt; स्ट्रिप अनुवादक _बेटिनी & lt; Derived2, Y & gt; {टाइप किए गए कुछ some_translator & lt; Derived2, Y & gt; प्रकार; };
मैं translator_between
के एक टेम्प्लेट स्पेशलाइजेशन का उपयोग करके एक ही बयान लिखना चाहता हूं।
एक उदाहरण (pseudocode) लिखने में सक्षम होना चाहते हैं:
टेम्पलेट & lt; typename वर्ग, टाइप नाम Y & gt; ONLY_INSTANTIATE_THIS_TEMPLATE_IF (कक्षा 'आधार' या 'बेस' से प्राप्त किसी भी) स्ट्रक्चर अनुवादक _बेटिनी & lt; कक्षा, वाई & gt; {टाइप किए गए कुछ some_translator & lt; कक्षा, वाई & gt; प्रकार; };
boost :: enable_if
और boost :: is_base_of
?
सबसे पहले, आपको अपनी पसंद को चुनना होगा:
-
is_base_of
-
is_convertible
दोनों & lt; boost / type_traits.hpp & gt;
में पाये जा सकते हैं, बाद वाले अधिक स्वीकार्य है।
यदि आप इस प्रकार के कुछ संयोजनों के तुरंत आरंभ को रोकते हैं, तो एक स्थिर ज़िक्र का प्रयोग करें:
// C ++ 03 #include & lt ; को बढ़ावा देने के / एमपीएल / assert.hpp & gt; टेम्पलेट & lt; typename से, टाइप नाम से & gt; Struct translator_between {BOOST_MPL_ASSERT ((बढ़ावा :: is_base_of & lt; से, से & gt;)); Typedef अनुवादक _selector & lt; से, से & gt; प्रकार; }; // C ++ 0x टेम्पलेट & lt; typename से, टाइप नाम से & gt; Struct translator_between {static_assert (बढ़ावा :: is_base_of & lt; से, से & gt; :: मान, "से प्राप्त नहीं होता है"); Typedef अनुवादक _selector & lt; से, से & gt; प्रकार; };
चूंकि यहां कोई अधिभार संकल्प नहीं हो रहा है, आपको enable_if
की आवश्यकता नहीं है।
Comments
Post a Comment