c++ - सी++ 11 में 'टाइपपीफ' और 'उपयोग' के बीच क्या अंतर है?
c++11 typedef (3)
टेम्पलेट्स के भीतर उपयोग किए जाने पर उपयोग वाक्यविन्यास का लाभ होता है। यदि आपको टाइप एब्स्ट्रक्शन की आवश्यकता है, लेकिन भविष्य में निर्दिष्ट होने के लिए टेम्पलेट पैरामीटर को भी संभव रखने की आवश्यकता है। आपको ऐसा कुछ लिखना चाहिए।
template <typename T> struct whatever {};
template <typename T> struct rebind
{
typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};
rebind<int>::type variable;
template <typename U> struct bar { typename rebind<U>::type _var_member; }
लेकिन वाक्यविन्यास का उपयोग इस उपयोग के मामले को सरल बनाता है।
template <typename T> using my_type = whatever<T>;
my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }
मुझे पता है कि सी ++ 11 में अब हम टाइप उपनाम लिखने के लिए उपयोग using
सकते हैं, जैसे typedef
एस:
typedef int MyInt;
क्या, मैं समझता हूं, इसके बराबर है:
using MyInt = int;
और वह नया वाक्यविन्यास " template typedef
" व्यक्त करने का एक तरीका रखने के प्रयास से उभरा:
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
लेकिन, पहले दो गैर-टेम्पलेट उदाहरणों के साथ, क्या मानक में कोई अन्य सूक्ष्म अंतर है? उदाहरण के लिए, typedef
एस एक "कमजोर" तरीके से अलियासिंग करते हैं। यही वह नया प्रकार नहीं बनाता है लेकिन केवल एक नया नाम (रूपांतरण उन नामों के बीच निहित है)।
क्या यह एक नया प्रकार उत्पन्न using
या using
करने के समान है? क्या कोई अंतर है?
वे अनिवार्य रूप से वही हैं लेकिन alias templates
प्रदान using
जो काफी उपयोगी है। एक अच्छा उदाहरण मैं पा सकता हूं निम्नानुसार है:
namespace std {
template<typename T> using add_const_t = typename add_const<T>::type;
}
तो, हम typename std::add_const<T>::type
बजाय std::add_const_t<T>
उपयोग कर सकते हैं
वे मानक (जोर खान) (7.1.3.2) से बराबर हैं:
उपनाम-घोषणा द्वारा एक टाइपिफ़-नाम भी पेश किया जा सकता है। उपयोग करने वाले कीवर्ड के बाद पहचानकर्ता टाइपिफ़-नाम बनने वाले पहचानकर्ता के बाद टाइपिफ़-नाम और वैकल्पिक विशेषता-विनिर्देशक-सीक बन जाता है। यह वही अर्थशास्त्र है जैसे कि इसे टाइपपीफ विनिर्देशक द्वारा पेश किया गया था। विशेष रूप से, यह एक नए प्रकार को परिभाषित नहीं करता है और यह टाइप-आईडी में दिखाई नहीं देगा।