C.中用户定义的输出流操纵器
User-defined Output Stream Manipulators in C
我正在学习C++,在用户定义的输出流操纵器部分,我被卡住了。这是示例代码:
#include <iostream>
using std::cout;
using std::flush;
using std::ostream;
ostream& endLine( ostream& output )
{
return output << 'n' << flush;
}
int main()
{
cout << "Testing:" << endLine;
return 0;
}
我的问题是,在endLine的定义中,有一个论点。但在主函数中,为什么它是endLine,而没有括号和根据参数。
std::basic_ostream
有几个operator<<
的重载,其中一个具有以下签名:
basic_ostream& operator<<( basic_ostream& st, std::basic_ostream& (*func)(std::basic_ostream&) );
也就是说,此函数获取一个指向同时获取和返回std::ios_base
的函数的指针。该方法由该函数调用,并合并到输入/输出操作中。从而使这成为可能:
std::cout << endLine;
因此,endLine
将被转换为函数指针,一个新行字符将被写入流,然后进行刷新操作。
std::ostream有一个operator<<
重载,它将指针指向接受指针的函数(或者可以调用的类似函数),并调用该函数,将自身作为参数传递给函数:
std::ostream &operator<<(std::ostream &os, ostream &(*f)(ostream &os)) {
return f(*this);
}
ostream
内置的版本来自std::ios_base
(这是它用于参数和返回的类型),但如果您试图编写自己的版本,通常需要使用std::ostream
。
cout
的左移运算符调用endLine
,cout
作为参数。函数(从技术上讲是函数指针)在编写它们的名称时不需要调用;您可以将它们作为值传递,然后让其他代码稍后调用它们。
相关文章:
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 在输出流中插入换行符
- 在类外部重载输入和输出流
- 通用容器的输出流
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- C++自定义流操纵器,用于更改流上的下一个字符串
- 如何使用自定义流操纵器在类实例中保存数据
- 如何实现接受参数的自定义流操纵器?
- 获取C++输出流中元素的大小
- 用于了解输入和输出流缓冲区实际工作方式的程序
- 控制多线程程序中的输出流
- 为什么输出流首选" "而不是""?
- C++ 输出流运算符 <<() 中的字符何时加宽?
- 音频缓冲区列表,用于输出流格式已压缩的 AUHAL 单元
- 如何将值发送到标准输出流并在另一个程序中访问这些值
- 我必须如何将OpenCV输出流到我自己的远程C GUI
- 如何为提升日志和自定义类型定义输出流运算符
- 修改视频帧并将其发送回视频输出流
- C.中用户定义的输出流操纵器