2012-02-23 51 views
7

मैं operator<< को मनमाने ढंग से सरणी के लिए अधिभारित करना चाहता हूं, जैसे कोड cout << my_arr काम करेगा। सबसे पहले मैंने operator<< के const T (&arr)[N] पर दूसरे पैरामीटर को अधिभारित करने का प्रयास किया, जहां T और N टेम्पलेट पैरामीटर हैं। लेकिन कोड का परीक्षण करने से साइड इफेक्ट सामने आया: const char[] भी टाइप स्पेसिफिकेशन से मेल खाता है, और स्ट्रीम क्लास में परिभाषित एक के साथ नए अधिभार संघर्ष। उदाहरण कोड:अधिभार ऑपरेटर << सरणी के लिए

#include <cstddef> 
#include <iostream> 

template<typename T, std::size_t N> 
std::ostream& operator<<(std::ostream& os, const T (&arr)[N]) 
{ 
    /* do stuff */ 
    return os; 
} 

int main() 
{ 
    std::cout << "noooo\n"; /* Fails: ambiguous overload */ 
} 

इस तरह के एक सरणी मुद्रण ऑपरेटर अभी भी लागू किया जा सकता है?

+0

मुझे नहीं लगता कि एन कई मामलों में अच्छी तरह से स्थानांतरित करेगा। 'शून्य एफ (int arr [], size_t एन) {cout << arr; } ' –

+0

यदि आप बाहरी पुस्तकालय चाहते हैं तो क्यों न केवल http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast.html – pyCthon

+1

@Captain:' arr' वास्तव में प्रकार 'int * है 'उस मामले में, तो यह उस अधिभार से मेल नहीं खाएगा। –

उत्तर

5

ज़रूर:

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

यह आपके अधिभार को निष्क्रिय कर देगा जब TSFINAE का उपयोग कर char है।

सी ++ 03 के लिए, बूस्ट में enable_if और is_same है। वैकल्पिक रूप से बस अपना खुद का रोल करें:

template<class T, class U> struct is_same { 
    enum { value = false }; 
}; 
template<class T> struct is_same<T, T> { 
    enum { value = true }; 
}; 

template<bool, class T> struct enable_if {}; 
template<class T> struct enable_if<true, T> { 
    typedef T type; 
}; 
+0

कोई सी ++ 03 समाधान? –

+1

@ श्री अनीबिस: इसके बजाय 'boost :: enable_if' और' boost :: is_same' का उपयोग करें। यदि आप बूस्ट नहीं चाहते हैं, तो उन्हें स्वयं लागू करें, ये दोनों छोटे हैं। –

+0

@GeorgFritzsche: आप सही हैं। लेकिन यह होना चाहिए? मुझे लगता है कि 'कॉन्स टी (&) []' एक गैर-कॉन्स सरणी से भी बांध सकता है, इसलिए हाँ, यह लिखित के रूप में ठीक है। यह 'const' का गहरा स्तर है जिसे स्पष्ट रूप से जोड़ा नहीं जा सकता है। –

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