templates - C++ boost enable_if question -


क्या मेरे पास निम्न कथन को आसान बनाने का कोई तरीका है? (शायद, 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 ?

का उपयोग करके इसे प्राप्त करने का कोई भी तरीका < P>

सबसे पहले, आपको अपनी पसंद को चुनना होगा:

  • 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