2012-06-08 16 views
7

के रूप में मैं चाहे << के माध्यम से char और unsigned char के की मेरी ostream outputting पात्रों या पूर्णांकों के रूप में उन्हें लिखते नियंत्रित करना चाहते हैं। मुझे मानक पुस्तकालय में ऐसा कोई विकल्प नहीं मिल रहा है। अभी के लिए मैंने वैकल्पिक प्रिंट फ़ंक्शंस के सेट पर एकाधिक ओवरलोड का उपयोग करने के लिए वापस कर दिया हैमुद्रण वर्ण पूर्णांकों

ostream& show(ostream& os, char s) { return os << static_cast<int>(s); } 
ostream& show(ostream& os, unsigned char s) { return os << static_cast<int>(s); } 

क्या कोई बेहतर तरीका है?

+1

आप हमेशा चाहते पूर्णांक या एक स्थिति के आधार पर के रूप में वर्ण मुद्रित करने के लिए है? – Andrey

+0

मैं चाहता हूं कि यह 'ios' राज्य झंडे के समान स्थिति (स्थिति) पर निर्भर करे। –

+4

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

उत्तर

0

मेरे पास how do I print an unsigned char as hex in c++ using ostream? में उपयोग की जाने वाली तकनीक के आधार पर एक सुझाव है।

template <typename Char> 
struct Formatter 
    { 
    Char c; 
    Formatter(Char _c) : c(_c) { } 

    bool PrintAsNumber() const 
    { 
    // implement your condition here 
    } 
    }; 

template <typename Char> 
std::ostream& operator<<(std::ostream& o, const Formatter<Char>& _fmt) 
    { 
    if (_fmt.PrintAsNumber()) 
    return (o << static_cast<int>(_fmt.c)); 
    else 
    return (o << _fmt.c); 
    } 

template <typename Char> 
Formatter<Char> fmt(Char _c) 
    { 
    return Formatter<Char>(_c); 
    } 

void Test() 
    { 
    char a = 66; 
    std::cout << fmt(a) << std::endl; 
    } 
+0

आप इस बात का एहसास करते हैं कि किसी चरित्र को संख्या के रूप में प्रिंट करने में सक्षम होने के लिए आपने 23 लाइन कोड (परीक्षक को छोड़कर) लिखा है, है ना? क्या यह थोड़ा अधिक नहीं है? – Neil

1

नहीं, कोई बेहतर तरीका नहीं है। एक बेहतर तरीका कस्टम स्ट्रीम मैनिपुलेटर का रूप लेगा, जैसे std::hex। फिर आप प्रत्येक नंबर के लिए इसे निर्दिष्ट किए बिना अपने पूर्णांक प्रिंटिंग को बंद कर सकते हैं। लेकिन कस्टम मैनिपुलेटर्स स्ट्रीम पर ही काम करते हैं, और आप जो चाहते हैं उसे करने के लिए format flags नहीं हैं। मुझे लगता है कि आप अपनी खुद की स्ट्रीम लिख सकते हैं, लेकिन अब आप ऐसा करने से कहीं अधिक काम कर रहे हैं।

ईमानदारी से, आपकी सबसे अच्छी शर्त यह देखने के लिए है कि क्या आपके टेक्स्ट एडिटर में static_cast<int> टाइप करने में आसान है। मुझे लगता है कि आप इसे अन्यथा टाइप करेंगे या आप नहीं पूछेंगे। इस तरह कोई व्यक्ति जो आपके कोड को पढ़ता है, जानता है कि कस्टम फ़ंक्शन की परिभाषा को देखे बिना आपका क्या मतलब है (यानी, एक पूर्णांक के रूप में एक char मुद्रण)।

+0

+1 उत्तर के लिए जो सादगी का समर्थन करता है। – Neil

0

बस पुरानी पोस्ट के लिए एक अपडेट। असली चाल '+' का उपयोग कर रही है। उदाहरण के लिए:

template <typename T> 
void my_super_function(T x) 
{ 
    // ... 
    std::cout << +x << '\n'; // promotes x to a type printable as a number, regardless of type 
    // ... 
} 

सी ++ 11 तुम कर सकते हो में:

template <typename T> 
auto promote_to_printable_integer_type(T i) -> decltype(+i) 
{ 
    return +i; 
} 

क्रेडिट: How can I print a char as a number? How can I print a char* so the output shows the pointer’s numeric value?

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