2011-09-16 20 views
6

मैं इसे इस तरह से करने की कोशिश कर रहा हूं:सी ++ में एक सरणी के लिए ऑपरेटर << कैसे अधिभार?

template <typename T> 
ostream &operator<<(ostream &os, T &arr) 
{ /*...*/ } 

लेकिन T एक सरणी का प्रतिनिधित्व कर सकता है? क्या सरणी के लिए << ऑपरेटर को अधिभारित करना सही है?


संपादित करें:

केरेक एसबी की सलाह के अनुसार, यहां <<:

template <typename T, unsigned int N> 
ostream &operator<<(ostream &os, const T (&arr)[N]) 
{ 
    int i; 
    for(i = 0; i < N; i++) 
     os << arr[i] << " "; 
    os << endl; 
    return os; 
} 

के लिए मेरा कार्यान्वयन है क्या मेरा कार्यान्वयन सही है? मुझे एक संकलन त्रुटि मिली है।

उत्तर

7

आप ऐसा कर सकता है:

template <typename T, unsigned int N> 
std::ostream & operator<<(std::ostream & os, const T (&arr)[N]) 
{ 
    // .. 
    return os; 
} 

यह केवल संकलन समय सरणियों के लिए, निश्चित रूप से काम करता है। ध्यान दें कि T एक अंतर्निहित प्रकार या std नामस्थान में एक प्रकार है जब आपको इस टेम्पलेट को तुरंत चालू करने की अनुमति नहीं है!

संभवतः इस इनलाइन को संभव बनाने के लिए सबसे अच्छा है, क्योंकि आप प्रत्येक N के लिए एक अलग तत्कालता का कारण बनेंगे। के लिए अधिभार const char (&)[6] मिलान टेम्पलेट, और (गैर टेम्पलेट): (pretty printer इस का एक उदाहरण है।)

आप देखेंगे हालांकि, कि कंबल टेम्पलेट एक अस्पष्टता का परिचय है, क्योंकि os << "Hello" अब दो संभावित भार के है क्षय-से-सूचक const char *, दोनों के समान रूपांतरण अनुक्रम हैं।

template <typename T, unsigned int N, typename CTy, typename CTr> 
typename std::enable_if<!std::is_same<T, char>::value, 
         std::basic_ostream<CTy, CTr> &>::type 
operator<<(std::basic_ostream<CTy, CTr> & os, const T (&arr)[N]) 
{ 
    // .. 
    return os; 
} 

तथ्य यह है कि ध्यान में रखते हुए:

#include <ostream> 
#include <type_traits> 

template <typename T, unsigned int N> 
typename std::enable_if<!std::is_same<T, char>::value, std::ostream &>::type 
operator<<(std::ostream & os, const T (&arr)[N]) 
{ 
    // .. 
    return os; 
} 

वास्तव में, यहां तक ​​कि अधिक सामान्य आप भी basic_ostream मापदंडों टेम्प्लेट पैरामीटर कर सकते हैं होने के लिए: हम चार सरणियों के लिए हमारे अधिभार को अक्षम करके इस हल कर सकते हैं T एक उपयोगकर्ता परिभाषित प्रकार होना चाहिए, आप थोड़ा और जांच प्राप्त करने के लिए is_same<T, char>is_fundamental<T> के साथ भी प्रतिस्थापित कर सकते हैं (लेकिन उपयोगकर्ताओं को अभी भी मानक लाइब्रेरी प्रकारों के सरणी के लिए इसका उपयोग नहीं करना चाहिए)।

+0

धन्यवाद, लेकिन मैं डॉन समझ में नहीं आता है कि अगर इनलाइन लागू नहीं किया जाता है तो यह प्रत्येक एन के लिए अलग तत्काल क्यों होता है? – Alcott

+0

अच्छा, यह एक टेम्पलेट है, इसलिए प्रत्येक टेम्पलेट इंस्टेंस आपके बाइनरी में एक अलग फ़ंक्शन के रूप में समाप्त हो सकता है। यदि आप इनलाइन करते हैं, तो आप संभवतः फ़ंक्शन कॉल से पूरी तरह से बच सकते हैं, हालांकि यह अंततः कंपाइलर तक है। –

+0

इसे मिला।इस ऑपरेटर के साथ << 2 टेम्पलेट तर्क होने के बाद, मैं दूसरा तर्क एन कैसे निर्दिष्ट कर सकता हूं? जाहिर है, मैं बस "cout << ar;" का उपयोग नहीं कर सकता, क्या मैं कर सकता हूं? – Alcott

3

एक और तरीका है तुम कर सकते हो यह निम्नलिखित की तरह कुछ होगा:

template<typename T> 
ostream& operator<<(ostream &out, const std::pair<T, int>& array) 
{ 
    //...code 
    return out; 
} 

कहाँ T एक सरणी के लिए सूचक ले जाएगा (यानी, यह सूचक प्रकार है कि सरणी में क्षय होगा हो जाएगा) , और जोड़ी के int भाग सरणी का आकार होगा। इसके बाद आप निम्नलिखित की तरह उपयोग कर सकते हैं: इस विधि के साथ

int array[10]; 
//...some code that initializes array, etc. 

cout << make_pair(array, 10); 

एक प्लस यह भी गतिशील सरणियों के लिए काम करेंगे है (यानी, सरणियों आप ढेर पर आवंटित आदि)

+0

मैं इसे आज़माउंगा। धन्यवाद – Alcott

+0

मुझे बहुत बेहोशी महसूस हो रही है कि अगर आप 'टी' उपयोगकर्ता द्वारा परिभाषित प्रकार नहीं हैं, तो आपको एडीएल के साथ परेशानी हो सकती है, हालांकि मैं सुनिश्चित नहीं हो सकता। –

+0

मैंने इसे 'int' जैसे बिल्ड-इन प्रकार के साथ परीक्षण किया ... ठीक काम करना प्रतीत होता था ... मुझे नहीं लगता कि यह एडीएल नियमों के साथ क्यों संघर्ष करेगा। यदि आपके पास 'std :: pair ' ऑब्जेक्ट है, तो टेम्पलेट 't' प्रकार को कम करने में सक्षम होना चाहिए, और' std :: pair 'का उपयोग करके किसी भी तत्काल को अस्वीकार कर सकता है, जहां 'U' प्रकार' int' नहीं है । – Jason

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