मैं वास्तव में उस नामकरण सम्मेलन से सहमत नहीं हूं। मेरे लिए, एक पूर्ण जेनेरिक प्रकार का प्रतिनिधित्व करने वाले टेम्पलेट पैरामीटर एक साधारण अक्षर के रूप में समझते हैं - यह एक प्रकार T
है, मुझे वास्तव में परवाह नहीं है। लेकिन अगर इस प्रकार की कोई आवश्यकता है, तो यह नाम उत्पन्न करने के लिए समझ में आता है कि टेम्पलेट तर्क क्या है: template <typename T, typename Allocator> struct container
- पहला प्रकार सामान्य है, कोई भी T
फिट होगा, लेकिन दूसरा एक आवंटक होगा।
यह काम करता है, जहां आप अपने मानकों को नहीं करना चाहते करने के लिए अलग नहीं a
, b
के नाम से जाना ... आदेश या दिखने में है, बल्कि प्रलेखन के हिस्से के रूप सार्थक नाम का उत्पादन। साथ ही, यदि स्टाइल गाइड विकसित करना है, तो मैं टेम्पलेट कक्षाओं के मामले में टेम्पलेट तर्कों के स्थानीय टाइपिफ को आवश्यक मानकों (जब भी संभव हो) पर स्थिर आवेषण के साथ एक साथ विचार करने पर विचार करता हूं। यही है, कम से कम अवधारणा उस कार्यक्षमता प्रदान करते हैं।
मैं एसटीएल को लाइब्रेरी का एक अच्छा उदाहरण मानता हूं और आप देख सकते हैं कि उत्पन्न करने वाले टाइप किए गए टाइप कोड को पढ़ने में मदद करते हैं (जी ++ 4 से।2 एसटीएल):
क्लास:
// from <vector> -> <bits/stl_vector.h>
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
// Concept requirements.
typedef typename _Alloc::value_type _Alloc_value_type; // _Alloc contains value_type internal type
__glibcxx_class_requires(_Tp, _SGIAssignableConcept) // _Tp is assignable
[...]
public:
typedef _Tp value_type; // from here on _Tp is not mentioned
typedef typename _Tp_alloc_type::reference reference; // check + typedef
[...]
iterator begin() {
// without typedef:
// __gnu_cxx::__normal_iterator<pointer, vector_type> begin() {
[...]
reference operator[](size_type __n)
// _Tp& operator[](size_type __n)
[...]
// from <memory>
template <typename _Tp>
class auto_ptr
{
[...]
template <typename _Tp1>
auto_ptr(auto_ptr<_Tp1>& __a) throw()
और कार्य:
template <typename _InputIterator, typename _Tp>
inline _InputIterator find(_InputIterator __first, _InputIterator __last, _Tp value) {
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
[...]
उनके नाम के सभी _
और या तो बड़े अक्षर या एक दूसरे _
, जो आरक्षित नाम हैं लगाया जाता है कर रहे हैं कार्यान्वयन के लिए, और वे _Tp
_T
से अधिक पसंद करते हैं, लेकिन अंत में आप देख सकते हैं कि जब भी एक प्रकार जेनेरिक इसे _Tp
कहा जाता है , _Tp1
..., जबकि जब इसकी कुछ विशिष्ट आवश्यकताएं संलग्न होती हैं, तो एक और समझदार नाम चुना जाता है।
, उन दोनों के बीच में एक ठीक लाइन नहीं है std::vector
में उदाहरण के लिए के रूप में, वहाँ सामान्य प्रकार पर वास्तविक आवश्यकताओं हैं: _Tp
आबंटित होना चाहिए, लेकिन दिन के अंत में, यह एक ज्यादातर सामान्य प्रकार है। इसे _Assignable
पर कॉल करना कुछ कंटेनरों में अजीब होगा जहां एक से अधिक आवश्यकताएं हैं।
जैसा कि आपने लिखा है '_.' या' __ * 'कार्यान्वयन (कुछ क्षेत्रों में) के लिए आरक्षित हैं, इसलिए आईएमएचओ इस प्रकार नामित किसी भी पहचानकर्ता का उपयोग करने से दूर रहना बेहतर है (भले ही यह संभवतः कोई नुकसान नहीं करेगा अभ्यास)। –