C++ 定义一个ostream修饰符c++;

C++ 定义一个ostream修饰符c++;,c++,ostream,iomanip,C++,Ostream,Iomanip,我正在生成程序集,我希望所有生成的代码都对齐。这包括让类似于cout流的函数获取并返回std::ostream&将在流上调用该函数。这是一些标准操纵器的定义方式,如果它们不需要任何参数,这是创建自己的操纵器的最快方法: namespace cds { std::ostream& pad(std::ostream& os) { return os << '\t' << std::setfill(' ') << std::setw(8);

我正在生成程序集,我希望所有生成的代码都对齐。这包括让类似于
cout流的函数获取并返回
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';
}
正如评论中所指出的,您实际上不需要不断重复,但由于您不知道(从操纵器作者的角度来看)在这段时间内流上会调用什么,您也可以这样做



另外,正如我所解释的,许多开发人员(包括我自己在内)都考虑使用<代码> EntL>代码>一个不好的实践。

<代码> OfStase<代码>定义了<代码>的超载操作程序,除了<代码> SEtW商店< /代码>是“粘性的”,所以您不必重复它们。您误读<代码>蒸汽<代码>作为<代码>流<代码>吗?
$ ./SO 
       Hello
       World
#include <iostream>
#include <iomanip>
using namespace std;

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

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