2010-07-01 3 views
7

Если бы я хотел вывести фиксированную ширину шестнадцатеричное число с 4 цифрами на потоке, я должен был бы сделать что-то вроде этого:есть хороший способ объединить манипуляторы потока?

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

, которая кажется немного долго наматывается. Использование макроса помогает:

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

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

Есть ли лучший способ совместить манипуляторы?

+0

импульс имеет библиотеку формат вывода: см http://stackoverflow.com/questions/119098/which-io-library-do-you-use -in-your-c-code/119194 # 119194 –

ответ

18

Избегайте использования макросов, когда вы можете! Они скрывают код, затрудняя отладку, не учитывают область видимости и т. Д.

Вы можете использовать простую функцию, предусмотренную приложением KenE. Если вы хотите, чтобы получить все фантазии и гибкие, то вы можете написать свой собственный манипулятором:

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

Если размер может быть определен во время компиляции, однако, может также просто использовать шаблон функции [спасибо Джон Парди для этого предложения]:

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 Я бы предпочел манипулятор для бесплатной функции, поскольку, похоже, лучше передать намерение. Чтобы сделать его полностью общим, напишите его как шаблон 'hex '. –

+0

@ Jon хороший звонок! Я отредактировал сообщение, чтобы включить это как возможность. – stinky472

+0

Я считаю, что то, что вы набрали в первом примере, не работает. Вам нужно написать 'hex4 (cout) << 123 << endl;'. – rlbond

4

Почему макрос - вы не можете использовать функцию вместо этого?

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

+1 и никаких макросов pls! KTHX – stinky472

Смежные вопросы