定义一个 ostream 修饰符 c++
Define an ostream modifier c++
我正在生成程序集,我想将所有生成的代码对齐。这包括在每个指令前面设置类似cout<<"t"<<left<<setfill(' ')<< setw(8);
。我怎样才能声明一个 ostream 修饰符,这将节省我在每一行编写所有这些代码的时间。我正在寻找这样的sth:
ostream mod="t"<<left<<setfill(' ')<< setw(8);
cout<<mod<<"addiu"<<"$sp, $sp, 24"<<endl;
我知道我可以用宏做到这一点,但我想知道如何使用 ostream 对象做到这一点。
流式处理一个接受并返回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
是一种不好的做法。
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;
}
相关文章:
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 将 ostream 包装在类中并模板化<<运算符
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 为什么在返回 ostream 类时使用引用?
- 将标准输出重定向到ostream
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- ostream& operator<< (ostream& (*pf)(ostream&));
- 使用 ostream 变量删除代码重复