C++ "if then else" template substitution -


मैं एक टेम्पलेट को निम्नानुसार घोषित करना चाहूंगा:

  टेम्पलेट & lt; typename T & gt; {यदि कक्षा टी के ऑब्जेक्ट्स में विधि foo () है, तो फिर int int = 1 और यदि वर्ग में एक स्थैतिक const int एल है तो const int k = l else const int k = 0; }  

मैं यह कैसे कर सकता हूँ? सामान्य तौर पर, मैं टी (या टी के अंदर परिभाषित टाइपिपीफ) के गुणों के आधार पर स्थैतिक संरचना निर्धारित करने के लिए एक तंत्र चाहता हूं।

बाहरी भाग निश्चित रूप से बहुत आसान है। Boost :: mpl :: if_ का उपयोग करने के लिए यह तय करें कि कौन सा int_ टाइप आपके मेटाफ़नशन से वापस लौटाएगा और उसके बाद उसमें मान का उपयोग करेगा। कोई बड़ा सौदा नहीं।

जिस भाग में आप यह पता लगाने की कोशिश करते हैं कि टाइप एक्स में फ़ंक्शन है f () अभी भी काफी सीधा है लेकिन दुर्भाग्य से आपको एक सामान्य जवाब नहीं मिलेगा। हर बार जब आपको इस तरह के निरीक्षण की आवश्यकता होती है तो आपको इसे ढूंढने के लिए एक कस्टम मेटाफ़ाइन लिखना होगा। SFINAE का प्रयोग करें:

  टेम्पलेट & lt; टिनामनाम टी एंड जीटी; Struct has_foo {typedef char (& amp; नहीं) [1]; टाइपिंगफेल (और हाँ) [2]; टेम्पलेट & lt; शून्य (टी :: *) () & gt; संरचना डमी {}; टेम्पलेट & lt; टाइपनाम एस & gt; स्थैतिक हां चेक (डमी एंड एलटी; एंड एस :: फू & gt; *); टेम्पलेट & lt; टाइपनाम एस & gt; स्थिर कोई जांच (...); Enum {value = sizeof (& lt; T & gt; (0)) == आकार (हाँ)}; };  

संपादित करें: ओह, और BOOST_MPL_HAS_XXX ()

के साथ अपने स्थिर कॉन्स्ट एल के लिए एक चेकर बनाएं

Comments

Post a Comment

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -