2016-02-14 2 views
0

У меня проблемы с iomanip. Я думаю, что упрощенный код может объяснить все лучше, чем слова.C++ форматирование таблицы iomanip

#include <iostream> 
#include <iomanip> 
#include <string> 

struct Dog { 
    std::string name; 
    int age; 
}; 

std::ostream& operator<<(std::ostream& os, Dog dog) { 
    return os << dog.name << ", " << dog.age << "yo"; 
} 

int main() { 
    Dog dog; 
    dog.name = "linus"; 
    dog.age = 10; 

    std::cout 
    << std::left << std::setw(20) << std::setfill(' ') << "INFO" 
    << std::left << std::setw(20) << std::setfill(' ') << "AVAILABLE" << std::endl; 

    std::cout 
    << std::left << std::setw(20) << std::setfill(' ') << dog 
    << std::left << std::setw(20) << std::setfill(' ') << "yes"; 

    std::cin.get(); 
} 

Я бы напечатал хорошо отформатированную таблицу, но мой результат плохо согласован. Проще говоря, когда я cout мою собаку, setw и setfill работает только на dog.name (из-за характера operator<<) и получается нечто вроде

INFO    AVAILABLE 
linus    , 10yoyes 

вместо

INFO    AVAILABLE 
linus, 10 yo  yes 

Очевидно, что я может изменить operator<<, добавив только один string в os, но в моем реальном случае мне нужно изменить тонны сложных определений (и я предпочитаю избегать таких изменений!: D)

Любая идея?

ответ

2

манипулятор setw устанавливает ширину поля следующий выход, который в этом случае равен dog.name. Нет никакого способа обойти это, если вы хотите использовать поток непосредственно в перегруженной функции.