2010-07-01 18 views
7

अगर मैं उत्पादन के लिए एक धारा पर 4 अंक के साथ एक निश्चित चौड़ाई हेक्स संख्या चाहता था, मैं इस तरह से कुछ करने की आवश्यकता होगी:स्ट्रीम मैनिपुलेटर्स को गठबंधन करने का कोई अच्छा तरीका है?

cout << "0x" << hex << setw(4) << setfill('0') << 0xABC; 

जो थोड़ा घना लगता है। मैक्रो का उपयोग में मदद करता है:

#define HEX(n) "0x" << hex << setw(n) << setfill('0') 

cout << HEX(4) << 0xABC; 

वहाँ manipulators गठबंधन करने के लिए एक बेहतर तरीका है?

+0

बढ़ावा एक आउटपुट स्वरूप पुस्तकालय है: http://stackoverflow.com/questions/119098/which-io-library-do-you-use देखना -इन-आपका-सी-कोड/119194 # 119194 –

उत्तर

18

मैक्रोज़ से बचें जब आप कर सकते हैं! वे कोड छिपाते हैं, चीजों को डीबग करने के लिए कठिन बनाते हैं, दायरे का सम्मान नहीं करते हैं, आदि

आप केनई के रूप में एक साधारण कार्य का उपयोग कर सकते हैं। आप सभी फैंसी और लचीला प्राप्त करना चाहते हैं, तो आप अपने खुद जोड़तोड़ लिख सकते हैं:

#include <iostream> 
#include <iomanip> 
using namespace std; 

ostream& hex4(ostream& out) 
{ 
    return out << "0x" << hex << setw(4) << setfill('0'); 
} 

int main() 
{ 
    cout << hex4 << 123 << endl; 
} 

यह है कि यह एक छोटे से अधिक सामान्य बनाता है। ऊपर दिए गए फ़ंक्शन का उपयोग किया जा सकता है क्योंकि operator<< पहले से ही इस तरह अधिभारित है: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&))endl और कुछ अन्य मैनिपुलेटर्स भी इस तरह कार्यान्वित किए जाते हैं।

आप अंकों की संख्या कार्यावधि में निर्दिष्ट करने की अनुमति देना चाहते हैं, तो हम एक वर्ग का उपयोग कर सकते हैं: आकार संकलन समय पर निर्धारित किया जा सकता है, तो

#include <iostream> 
#include <iomanip> 
using namespace std; 

struct formatted_hex 
{ 
    unsigned int n; 
    explicit formatted_hex(unsigned int in): n(in) {} 
}; 

ostream& operator<<(ostream& out, const formatted_hex& fh) 
{ 
    return out << "0x" << hex << setw(fh.n) << setfill('0'); 
} 

int main() 
{ 
    cout << formatted_hex(4) << 123 << endl; 
} 

, तथापि, के साथ-साथ बस का उपयोग कर सकते एक समारोह टेम्पलेट [इस सुझाव के लिए जॉन Purdy के लिए धन्यवाद]:

template <unsigned int N> 
ostream& formatted_hex(ostream& out) 
{ 
    return out << "0x" << hex << setw(N) << setfill('0'); 
} 

int main() 
{ 
    cout << formatted_hex<4> << 123 << endl; 
} 
+3

+1 मैं एक मुक्त फ़ंक्शन के लिए एक मैनिपुलेटर पसंद करूंगा, क्योंकि यह इरादे को बेहतर ढंग से व्यक्त करता है। इसे पूरी तरह से सामान्य बनाने के लिए, इसे 'हेक्स ' टेम्पलेट के रूप में लिखें। –

+0

@ जोन अच्छा कॉल! मैंने उस सूची को तदनुसार संपादित किया है जिसमें एक संभावना के रूप में शामिल है। – stinky472

+0

मुझे विश्वास है कि आपने अपने पहले उदाहरण में जो टाइप किया है वह काम नहीं करता है। आपको 'हेक्स 4 (कोउट) लिखना होगा << 123 << endl; '। – rlbond

4

क्यों मैक्रो - आप इसके बजाय फ़ंक्शन का उपयोग नहीं कर सकते?

void write4dhex(ostream& strm, int n) 
{ 
    strm << "0x" << hex << setw(4) << setfill('0') << n; 
} 
+0

+1 और कोई मैक्रोज़ pls! KTHX – stinky472

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

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