定义ostream修饰符c ++

时间:2016-03-14 21:16:13

标签: c++ ostream iomanip

我正在生成程序集,我希望将所有生成的代码对齐。这包括在每条指令前面都有cout<<"\t"<<left<<setfill(' ')<< setw(8);。如何声明一个ostream修饰符,这将保存我在每一行编写所有这些代码。我正在寻找......:

ostream mod="\t"<<left<<setfill(' ')<< setw(8); cout<<mod<<"addiu"<<"$sp, $sp, 24"<<endl;

我知道我可以用宏来做这件事,但我想知道如何用ostream对象做到这一点。

2 个答案:

答案 0 :(得分:1)

使用并返回std::ostream&的函数流将在流上调用该函数。这是一些标准操纵器的定义方式,如果他们不需要采取任何参数,那么这是创建自己的最快方式:

namespace cds {
std::ostream& pad(std::ostream& os) {
    return os << '\t' << std::setfill(' ') << std::setw(8);
}
}

int main() {
    std::cout << cds::pad << "Hello" << '\n'
              << cds::pad << "World" << '\n';
}

打印:

$ ./SO 
       Hello
       World

正如评论中指出的那样,你并不需要继续重复setfill,但是你不知道(从操纵者的作者的角度来看)会是什么在你之间的流媒体上,你也可以。

此外,在我解释here时,包括我自己在内的许多开发人员都会考虑使用endl这种不良做法。

答案 1 :(得分:0)

ostream定义了operator<<的重载,它接受了流的功能,因此您可以轻松定义自己的操纵器:

#include <iostream>
#include <iomanip>
using namespace std;

ostream& foo(ostream& s) {
    return s << hex << setw(4) << setfill('#');
}

int main() {
    cout << foo << 42;
    return 0;
}