定义一个ostream修饰符c++
Define an ostream modifier c++
我正在生成程序集,我希望对齐所有生成的代码。这包括在每条指令前面加上 cout<<"\t"<<left<<setfill(' ')<< setw(8);
之类的东西。我怎样才能声明一个 ostream 修饰符,这样我就不用在每一行都写所有这些代码了。我正在寻找类似的东西:
ostream mod="\t"<<left<<setfill(' ')<< setw(8);
cout<<mod<<"addiu"<<"$sp, $sp, 24"<<endl;
我知道我可以使用宏来完成此操作,但我想知道如何使用 ostream 对象来完成此操作。
流式传输一个接受 returns 和 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
是一种不好的做法。
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;
}
我正在生成程序集,我希望对齐所有生成的代码。这包括在每条指令前面加上 cout<<"\t"<<left<<setfill(' ')<< setw(8);
之类的东西。我怎样才能声明一个 ostream 修饰符,这样我就不用在每一行都写所有这些代码了。我正在寻找类似的东西:
ostream mod="\t"<<left<<setfill(' ')<< setw(8);
cout<<mod<<"addiu"<<"$sp, $sp, 24"<<endl;
我知道我可以使用宏来完成此操作,但我想知道如何使用 ostream 对象来完成此操作。
流式传输一个接受 returns 和 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
是一种不好的做法。
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;
}