существует ли хороший способ объединить потоковые манипуляторы?

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

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

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

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

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

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

7
задан stinky472 2 July 2010 в 05:18
поделиться

2 ответа

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

Вы можете использовать простую функцию, предоставленную 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;
}
18
ответ дан 6 December 2019 в 08:14
поделиться

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

void write4dhex(ostream& strm, int n)
{
    strm << "0x" << hex << setw(4) << setfill('0') << n;
}
4
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: