3

我正在生成程序集,我想让所有生成的代码对齐。这包括cout<<"\t"<<left<<setfill(' ')<< setw(8);在每条指令前面加上类似的东西。我怎样才能声明一个 ostream 修饰符,这将节省我在每一行编写所有这些代码的时间。我正在寻找类似的东西:

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

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

4

2 回答 2

2

流式处理一个接受并返回 a 的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,但是由于您不知道(从操纵器作者的角度来看)在两者之间的流上会调用什么,您也可以.


此外,正如我在这里解释的那样,包括我自己在内的许多开发人员都在考虑使用endl不好的做法。

于 2016-03-14T21:21:58.130 回答
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;
}
于 2016-03-14T21:22:44.947 回答