0

我有麻烦了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我的狗时setwsetfill仅在 dog.name 上工作(因为 的性质operator<<),结果类似于

INFO                AVAILABLE
linus               , 10yoyes

代替

INFO                AVAILABLE
linus, 10 yo        yes

显然我可以修改operator<<,只附加一个stringos但在我的真实情况下,我必须更改大量复杂的定义(我更喜欢避免这样的更改!:D)

任何想法?

4

1 回答 1

3

操纵器设置下一个输出的setw字段宽度,在这种情况下为。如果你想直接在重载函数中使用流,那真的没有办法。dog.name

于 2016-02-14T15:20:06.190 回答