- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们知道 endl
是操纵器,它在内部将 '\n'
放入缓冲区,然后刷新缓冲区。 endl
定义在哪里?什么是endl
,它是宏还是函数还是变量还是类还是对象?如何定义自己的 endl
操纵器?
cout << "hello" << endl ; /*what is endl and where it is defined */
最佳答案
std::endl
是签名的函数模板:
template<class CharT, class Traits>
std::basic_ostream<CharT,Traits>& endl(std::basic_ostream<CharT,Traits>&);
std::basic_ostream::operator<<
过载 std::basic_ostream<CharT,Traits>>::operator<<(std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&))
接受某个签名的函数。
当你做 std::cout << std::endl
, 重载解析在 std::endl
上完成,它确定了 std::endl
的正确模板类型并实例化一个函数。然后它会衰减为一个指针,并传递给 operator<<
.
std::basic_ostream::operator<<
然后在有问题的 ostream 上调用函数,并返回返回值。像这样的东西:
template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>&
std::basic_ostream<CharT, Traits>::operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&)
) {
return func(*this);
}
但具体的实现取决于编译库作者1。
std::endl
导致打印换行符,然后告诉 ostream 刷新自身。你可以模拟做 std::cout << std::endl;
通过这两行代码:
std::cout.put(std::cout.widen('\n'));
std::cout.flush();
究竟如何std::endl
是否实现取决于编译器,但以上是您可能如何编写它的一个不错的近似值(自然地在通用流上)。
保证您可以访问 std::endl
如果你#include <ostream>
.如果您包含来自 std
的任何其他头文件,您可能可以访问它图书馆。什么文件准确定义它又取决于实现。
std::endl
被称为“io 操纵器”。此技术旨在允许通过链接 <<
将操作 io 流状态的函数设置为与输出命令“内联”一起打电话。
要创建您自己的,如果您希望它与单一类型的 ostream 一起工作,只需创建一个采用那种 ostream
的函数。通过引用,并通过引用返回它。它现在是一个 io 操纵器。
如果你想处理一组流,创建一个像这样的模板:
template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>& bob(std::basic_ostream<CharT, Traits>& os)
{
return os << os.widen('b') << os.widen('o') << os.widen('b');
}
现在是一个输出 "bob"
的 io 操纵器.它可以对 basic_ostream
做任何你想做的事有问题。
另一种方案是这样的:
struct bob_t {
template<class OS>
OS& operator()(OS& os)const {
return os << os.widen('b') << os.widen('o') << os.widen('b');
}
template<class OS>
operator OS&(*)(OS&)() const {
return [](OS& os)->OS&{ return bob_t{}(os); };
}
};
static const bob_t bob;
哪里bob
现在是一个可以用作 io 操纵器的对象。
1 这个<<
重载是 A->(A->A)->A
类型的函数.基本上,我们不是将 X 传递给 f,而是将 X 和 f 传递给 <<
。 ,然后执行 f(X)
.纯语法糖。
事实std::endl
是一个模板意味着完美转发由于这种技术它有点痛苦。我最终定义了无状态函数 endl_t
类型,带有 operator basic_ostream<CharT,Traits>&(*)(basic_ostream<CharT,Traits>&)()const
过载,所以有时我可以通过完美的转发代理传递过载集。
然后我们可以传递整个重载集 f:(A->A)
至 <<
,并让“下一层”解决过载问题。
关于c++ - endl操纵器在哪里定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553091/
我是puppeteer的新手(通常对javascript不太了解),并且正在尝试编写一些基本功能来: 从XPath获取所有链接 循环浏览并单击那些链接 屏幕截图并保存页面的HTML 返回屏幕快照,然后
您好,我正在尝试创建一个我想通过网络发送到服务器的数据包,我几乎已经对数据包进行了排序,但是它缺少一个长度标识符,我需要在我的方法结束时计算它并添加放入数据包。 数据包结构是这样的 前导值标识符 (U
我正在尝试更改按钮的样式(实际上只是一个 div)。我可以在 CSS 中使用 .classname:active 来实现,但是按钮只会在被点击时改变样式;单击释放后,它不会保持样式更改。所以,我决定使
我有一个下拉导航栏(fiddle here 和下面的代码片段)。单击 SubItem 时,JS 函数会进行 Ajax 调用(未显示)。我想要实现的是在单击 SubItem 时隐藏 SubItems 列
给定一组平面图(Autocad、svg 或任何需要的格式...),我想以编程方式生成从 A 点到 B 点的方向。基本上我想说:“我如何获得从101房间到143房间?” (或三倍奖励积分,从 101 房
我在 Win32 下的 MS dev studio 中将一些代码从 C 转换为 C++。在旧代码中,我使用 QueryPerformanceCounter() 进行了一些高速计时,并对获得的 __in
我正在寻找一种方法来从 QTableWidget 单元格中挤出所有可能的空间。我粘贴了一些代码来演示我在下面尝试过的事情,并且我上传了在 OSX 10.8.5、Qt 4.8.4、PySide 1.2.
对于 PhoneGap 移动应用程序,我有以下场景: 应用程序打开并显示index.html 用户登录并被重定向到 home.html 然后用户可以转到 news.html 我想以一种方式处理 hom
可能是一个简单的问题: 尝试使用plotly生成散点图并自定义图例。 这是我的数据: require(plotly) set.seed(1) my.df % add_annotations(text=
在 Instagram/Facebook 上的帖子下方,您会看到类似“第 1 个人、第 2 个人和其他 10 个人喜欢此帖子”的文字。我想知道如何使用 Django 来实现网站的相同效果?通常,我会使
我必须使用 Form.Action 重定向到将从我的页面获取值的脚本。值得注意的是,这个脚本是外部的。 我的问题是,我还想要被点击并连接了 Action 的按钮,以便首先在后面的代码中完成一些功能。
我有一个问题。 我可以在 Express 中操纵路线吗?当我发出 get 或 post 申请地址时,我可以将 2 条路线传递到同一个 get 或 post 申请吗?像这样的东西。 module.exp
如果我在不同的 Canvas 上绘制我的图像,我可以使用 js 库应用一些效果,如淡入淡出、移动和其他效果吗?如果可能的话,在速度和性能方面可能会很有趣,而不是操纵“原始”?非常感谢 最佳答案 if
我希望你能帮助我。如何转换这个扁平的 JavaScript 数组,来自: [ {"state":"First State","district":"First District","local_
我有一个 React JSX 元素,我想遍历它的子元素,对其中的每个字符串元素执行替换(或任何其他操作),然后返回新的、修改后的 JSX 元素。例如: var element = Text { var
我正在制作一个 Java 网络项目,我想在其中使用一些 javascript 操作一些前端 SVG 元素。 我正在绘制一个相当简单的车库图,其中有一个来自 JSP 页面的棚屋元素。 我想要一个 jav
我读过许多帖子,其中人们询问有关对 XML 元素强制执行某些属性顺序的问题,一般的回答是这不合法/必需/不允许/相关/其他。 我不是在寻找任何说我不应该关心属性顺序的回复,所以如果这是你的观点,请不要
大家好,我的问题是,如何将两个 C 风格的字符串 append 到一个字符串中? 我对 C++ 的处理方式 (std::string) 很感兴趣,我从未接触过 C 风格的字符串,需要为我当前的开发项目
我选择了 HTML 页面上的所有节点,如下所示: var all = $('*'); 然后我遍历每个节点,检查每个节点是否有关联的文本值: var newDom = all.map((i, node)
示例取自 Mozilla's help page re = /(\w+)\s(\w+)/; str = "John Smith"; newstr = str.replace(re, "$
我是一名优秀的程序员,十分优秀!