Избегайте использования макросов, когда вы можете! Они скрывают код, затрудняя отладку, не учитывают область видимости и т. Д.
Вы можете использовать простую функцию, предусмотренную приложением 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;
}
импульс имеет библиотеку формат вывода: см http://stackoverflow.com/questions/119098/which-io-library-do-you-use -in-your-c-code/119194 # 119194 –