2016-03-14 76 views
2

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

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

我知道我可以用宏做到这一点,但我想知道我怎么能与ostream的对象做到这一点。

+1

机械臂是“粘性”,这样你就不需要不断重复他们。 – Praetorian

+0

你误读'蒸汽'作为'流'吗? – user463035818

回答

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一种不好的做法。

0

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

比`setw`其他
#include <iostream> 
#include <iomanip> 
using namespace std; 

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

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