2010-07-01 32 views
7
Bir akışta 4 hanesiyle çıkışına sabit genişlikli onaltılık sayı isteseydim

, ben böyle bir şey yapmak gerekir: biraz uzun soluklu görünüyorAkış manipülatörlerini birleştirmenin iyi bir yolu var mı?

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

. Bir makronun kullanılması:

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

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

Manipülatörleri birleştirmenin daha iyi bir yolu var mı?

+0

artırmak bir çıkış biçimi kütüphanesi var http://stackoverflow.com/questions/119098/which-io-library-do-you-use bakınız -in-sizin-c-kod/119194 # 119194 –

cevap

18

makroları kaçının! Kodları gizler, hata ayıklamalarını zorlaştırır, kapsamlara saygı göstermezler.

Basit bir işlevi KenE tarafından sağlanan şekilde kullanabilirsiniz. Eğer fantezi ve esnek tüm almak istiyorsanız, o zaman kendi manipülatör yazabilirsiniz:

#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; 
} 

Bu biraz daha genel hale getirir. Yukarıdaki fonksiyonun kullanılmasının nedeni operator<<'un zaten aşırı yüklendiği için: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&)). endl ve diğer bazı manipülatörler de böyle uygulanmaktadır.

Eğer hane sayısı zamanında belirtilen izin vermek istiyorsak, bir sınıf kullanabilirsiniz: boyutu derleme zamanında tespit edilebilir varsa

#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; 
} 

Ancak, hem de sadece kullanabilir bir fonksiyon şablonu [bu öneriye Jon Purdy sayesinde]:

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 Serbest bir işleve bir manipülatör tercih ederim, çünkü daha iyi bir amaç taşımaktadır. Tamamen jenerik yapmak için, 'hex 'şablon olarak yazın. –

+0

@Jon iyi bir çağrı! Bu yazıyı bir olasılık olarak içerecek şekilde düzenledim. – stinky472

+0

İlk örneğinizde yazdığınızın işe yaramadığına inanıyorum. Hex4 (cout) yazmalısınız << 123 << endl; '. – rlbond

4

Neden bir makro - bunun yerine bir işlev kullanamazsınız? zaman yapabilirsiniz

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

+1 ve hiçbir makroları pls! KTHX – stinky472

İlgili konular