2017-01-10 4 views
6

मैंने एक टेम्पलेट फ़ंक्शन लिखा है जो मनमानी संख्याओं को लेता है और अंतर्निहित वास्तुकला और ऑपरेटिंग सिस्टम के लिए अपने आकार प्रदर्शित करता है। हालांकि, फ़ंक्शन वास्तविक प्रकार से उपनाम को अलग करने में सक्षम नहीं है, इसलिए इसका मूल्यांकन किया जाता है जैसे कि यह वास्तविक प्रकार है।संकलन समय पर उपनाम और वास्तविक प्रकार को अलग करना?

अभी तक मैं संकलन समय पर एक उपनाम और निर्मित प्रकार अलग और उस पर आधारित उत्पादन वैकल्पिक करने में सक्षम होना चाहता हूँ।

func<unsigned int, size_t>(); 

आउटपुट:

Unsigned int is 4 bytes. 
Unsigned int is 4 bytes. 

हालांकि, मैं उत्पादन

Unsigned int is 4 bytes. 
size_t is an alias for unsigned int. 
पाठ्यक्रम कि संकलक की आवश्यकता है एक उपनाम और अलग करने के लिए सक्षम होने के लिए की

की तरह बनना चाहते हैं, बिल्ट-इन संकलन समय पर टाइप करें।

तो, वहाँ कोई वास्तविक प्रकार और किसी सी ++ संस्करण में संकलन समय पर एक उपनाम फर्क का तरीका है?

+2

नए उपयोगकर्ता से क्या अच्छा सवाल है! – Bathsheba

उत्तर

6

जवाब यह है कि आप इसे अब ऐसा नहीं कर सकते है। हालांकि, स्थिर प्रतिबिंब के लिए एक प्रस्ताव है: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

इस दस्तावेज़ में, वे Operation get_base_name का उल्लेख करते हैं जो प्रकार का नाम वापस कर देगा। हालांकि वे राज्य:

get_base_name एक मेटा पर लागू :: उर्फ ​​उर्फ ​​नाम, नहीं aliased घोषणा का नाम देता है।

वे तो Operation get_aliased प्रदान करते हैं जब get_base_name के साथ प्रयोग किया एक उपनाम का मूल प्रकार प्राप्त करने के लिए इस्तेमाल किया जा सकता है।

दस्तावेज़ से उदाहरण कोड:

using rank_t = int; 

using mR = reflexpr(rank_t); 
cout << "5:" << get_base_name_v<mR> << endl; 
cout << "6:" << get_base_name_v<get_aliased_m<mR>> << endl; 

निम्नलिखित उत्पादन का उत्पादन:

5:rank_t; 
6:int; 

बोनस: आप इस अब कोशिश कर रहा में रुचि रखते हैं, तो निम्न दस्तावेज़, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0385r1.pdf, उल्लेख करता है कि यहां गिटहब पर एक क्लैंग कांटा पर प्रारंभिक प्रयोगात्मक कार्यान्वयन है: https://github.com/matus-chochlik/clang/tree/reflexpr

6

आप भाग्य से बाहर हैं।

है, दुर्भाग्य से, संकलन समय या कार्यावधि में भेद करता है, तो एक प्रकार एक आदिम प्रकार, या एक आदिम प्रकार का एक typedef है का कोई रास्ता नहीं।

+0

इस तरह के उत्तर मुझे वास्तव में ऐसा करना चाहते हैं। असल में, आप धोखा देंगे, और प्रीप्रोसेसर का उपयोग करें। कैनोलिक नामों की एक तालिका बनाए रखें। यदि इस्तेमाल किया जाने वाला टोकन कैनोलिक नाम से मेल नहीं खाता है, तो आप जान लेंगे कि यह एक उपनाम है। लेकिन अगर मैंने ऐसा किया, तो कोई वास्तव में इसका उपयोग कर सकता है, और मुझे लगता है कि मैं icky महसूस करता हूं। – Yakk

+1

@Yakk फिर से नहीं ... – Quentin

संबंधित मुद्दे