Перегрузка ostream & operator <<: как заставить выводить нули? - PullRequest
2 голосов
/ 12 февраля 2012

Я хочу перегрузить

ostream& operator<<(ostream& out, const myType& y)

, чтобы вывести большие целые числа без знака, представленные в myType вектором unsigned short.Так что, если рассматриваемый вектор имеет, скажем, элементы 1f, a356, 13d5, я хочу получить вывод 1fa35613d5 - сейчас мне это нужно только для вывода hex или oct.В частности, 1, 0, 0 должно быть выведено до 100000000.Я хочу добиться этого путем последовательного вывода элементов вектора.Однако с помощью этого метода я получаю 100, несмотря на то, что я установил

out.width(4);
out.fill('0');
out << std::internal;
out << std::noskipws;

Конечно, я мог сначала записать ushort в строку, а затем вывести ее, но яЯ бы предпочел использовать только инструкции по форматированию для out, поскольку это облегчает соблюдение настроек hex или oct out.Какой вариант форматирования мне здесь не хватает?

1 Ответ

2 голосов
/ 12 февраля 2012

Следующая программа печатает шестнадцатеричные символы фиксированной ширины:

#include <iostream>
#include <iomanip>
#include <vector>

int main()
{
    std::vector<unsigned short int> v { 10, 25, 0, 2000 };

    for (auto n : v)
    {
        std::cout << "0x" << std::hex << std::setfill('0')
                  << std::setw(4) << n << std::endl;
    }
}

Вывод:

0x000a
0x0019
0x0000
0x07d0

Если вы пишете для этого функцию форматирования, вам не нужноповторите std::hex, поскольку это постоянно.Сохранение состояния ostream немного сложновато, поэтому, возможно, вам стоит взглянуть на что-то вроде Boost-заставки.

...