आप ऐसा कर सकता है:
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>
के साथ भी प्रतिस्थापित कर सकते हैं (लेकिन उपयोगकर्ताओं को अभी भी मानक लाइब्रेरी प्रकारों के सरणी के लिए इसका उपयोग नहीं करना चाहिए)।
धन्यवाद, लेकिन मैं डॉन समझ में नहीं आता है कि अगर इनलाइन लागू नहीं किया जाता है तो यह प्रत्येक एन के लिए अलग तत्काल क्यों होता है? – Alcott
अच्छा, यह एक टेम्पलेट है, इसलिए प्रत्येक टेम्पलेट इंस्टेंस आपके बाइनरी में एक अलग फ़ंक्शन के रूप में समाप्त हो सकता है। यदि आप इनलाइन करते हैं, तो आप संभवतः फ़ंक्शन कॉल से पूरी तरह से बच सकते हैं, हालांकि यह अंततः कंपाइलर तक है। –
इसे मिला।इस ऑपरेटर के साथ << 2 टेम्पलेट तर्क होने के बाद, मैं दूसरा तर्क एन कैसे निर्दिष्ट कर सकता हूं? जाहिर है, मैं बस "cout << ar;" का उपयोग नहीं कर सकता, क्या मैं कर सकता हूं? – Alcott