Как разрешить setw применять ко всем следующим stdout?

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

Например, для следующей строки кода

cout<<setw(3)<<setfill('0')<<8<<" "<<9<<endl;

или

cout.width(3);
cout.fill('0');
cout<<8<<" "<<9<<endl;

Я хочу, чтобы на выходе был 008 009 вместо 008 9

Ответ 1

setw не является липким, поэтому вы должны сказать это каждый раз:

cout << setfill('0') << setw(3) << 8 << " "
     << setw(3) << 9 << endl;

Ответ 2

Написание длинной std:: setw (14) каждый раз занимает много времени, поэтому написал макрос и используется как показано ниже:

Macro:

#define W14 std::setw(14)

Пример # 1: Простое использование:

std::cout << W14 << 8 << W14 << 9 << W14 << "ABC" << W14 << "DEFGHI" << std::endl;

Вывод:

8             9           ABC        DEFGHI

Пример # 2: Я решаю вопрос в алгоритме, используя его, как показано ниже, в цикле for:

std::cout
    << W14 << suffixes[i].first.c_str()
    << W14 << suffixes[i - 1].first.c_str()
    << W14 << i
    << W14 << lcp[i] << std::endl;

Выход: красивый, в цикле for:

        a$             $             1             0
      ana$            a$             2             1
    anana$          ana$             3             3
   banana$        anana$             4             0
       na$       banana$             5             0
     nana$           na$             6             2

Ответ 3

Хм. Используйте прокси-структуру для этого.

struct setw_all_the_way {
    template <typename T> std::ostring &operator << (T &&t) {
        return std::cout << std::setw(14) << std::forward<T>(t);
    }
};
setw_all_the_way << ...;