endl 操纵器在哪里定义

2023-12-22

我们知道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>&);

The 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);
}

But the exact implementation is up to the compiler library writer1.

std::endl导致打印换行符,然后告诉 ostream 自行刷新。你可以效仿做std::cout << std::endl;通过这两行代码:

std::cout.put(std::cout.widen('\n'));
std::cout.flush();

究竟如何std::endl实现取决于编译器,但上面是您如何编写它的一个不错的近似(自然在通用流上)。

保证您可以访问std::endl if you #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');
}

现在是一个 io 操纵器,可以打印"bob"。它可以做任何你想做的事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;

where bob现在是一个可以用作 io 操纵器的对象。


1 This << overload is a function of type A->(A->A)->A. Basically, instead of passing X to f, we pass X and f to <<, which then does f(X). Pure syntactic sugar.

事实是std::endl是一个模板意味着完美转发由于这种技术而有点痛苦。我最终定义了无状态函数endl_t类型,具有operator basic_ostream<CharT,Traits>&(*)(basic_ostream<CharT,Traits>&)()const过载,所以有时我可以通过完美的转发代理传递过载集。

然后我们可以传递整个重载集f:(A->A) to <<,并让“下一层”解决过载问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

endl 操纵器在哪里定义 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 如何在 Web 应用程序中启用 Eclipse 调试功能?

    我正在使用 Eclipse IDE 和 PyDev 插件为我的 Python Web 应用程序使用 Django 框架 如何使用调试功能 UPDATES1特别是使用http pydev org updates http pydev org
  • Android xsl 转换空指针,但在桌面上工作

    我正在 Android 上开发 xslt users xml 文件
  • 如何通过用均值替换来处理 R 中的缺失值? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个看起来像这样的数据框 row1 key1 10 row2 key1 12 row3 key1 NA row4 key2 2 r
  • 根据列表列连接两个 pandas 数据框

    I have 2 个数据框包含列表的列 我想join他们基于2 共同价值观在名单上 例子 ColumnA ColumnB ColumnA ColumnB id1 a b c id3 a b c x y z id2 a d e 在这种情况下我
  • 如何将 MSSQL PRINT 输出存储到变量

    在 MS SQL 2008 R2 上 我希望能够将消息输出捕获到变量中 我需要在许多数据库上运行脚本 捕获消息输出 来自 print 或 raiserror 的消息 并将其记录到表中 我需要从存储过程内部执行此操作 对于这个脚本 Decla
  • 对于 Perl 开发的理想 Vim 配置,您有何建议?

    有很多关于如何配置的线程Vim GVim http www vim org 用于 Perl 开发在 PerlMonks org 上 http www google com search q vimrc site 3Aperlmonks or
  • 进行同步 JavaScript 调用的技巧 [重复]

    这个问题在这里已经有答案了 JavaScript 在大多数现代 API 中使用异步调用来处理磁盘 IO 和网络等 慢 事物 我意识到这样做的目的是什么 但是在某些情况下确实需要进行同步调用 例如 我有一段无法重写的 JavaScript 代
  • 输入类型=“按钮”的 onClick 函数不起作用

    我有这段代码 单击 获取更多字段 按钮将创建整个 div 的副本并创建字段 但点击按钮后什么也没有发生 所有其他按钮都工作正常 不知道我做错了什么 提前感谢您的帮助 div style display none div
  • 使用 Jersey 1.x 进行自定义注释注入

    我使用的是球衣 1 9 1 我有如下休息方法 授权标头包含编码凭据 例如用户名 和密码 并在方法中解析并映射本地值 PUT Path SystemConstants REST MESSAGE SENDSMS Consumes MediaTy
  • 使用 MSAL 对 Azure 静态 Web 应用中的函数进行授权

    我正在尝试使用 Azure AD 和 MSAL 对使用 Azure 静态 Web 应用创建和公开的 Azure 函数进行身份验证和授权 如果我将应用配置为使用较旧的 AAD v1 流 但不使用 MSAL 则用户可以成功访问 API 设置 用
  • 如何用Delphi计算当前日期的日出和日落时间

    我需要在给定特定纬度和经度的情况下并使用 Delphi 我正在使用 XE2 确定当天的日出和日落时间 当地时间 我找到了本文 http en wikipedia org wiki Sunrise equation并使用了系统工具库 http
  • “无法计算表达式...”错误

    在 Visual Studio 2010 beta 2 中调试应用程序时 突然出现以下错误 无法评估表达式 因为 线程停止在某个点 垃圾收集是不可能的 可能是因为代码是 优化 监视窗口中的几乎每个属性或字段都会显示此消息 有谁知道发生了什么
  • 当我们可以解析线性回归时为什么要梯度下降

    在线性回归空间中使用梯度下降有什么好处 看起来我们可以用分析方法解决这个问题 找到最小成本函数的theta0 n 那么为什么我们仍然想使用梯度下降来做同样的事情呢 谢谢 当您使用正规方程为了分析求解成本函数 您必须计算 其中 X 是输入观测
  • LinearLayout 的边距,以 dp 编程

    是否可以以编程方式设置 LinearLayout 的边距 但不能使用像素 而是使用 dp 您可以使用显示指标 http developer android com intl de reference android util Display
  • 如何在 cakephp 中设置默认时区?

    所以我的系统已经基本完成 只是解决了一些最后的错误 我们遇到一个问题 该程序似乎永久设置在纽约时区 我在 core php 和 bootstrap php 中都有这行代码 date default timezone set Australi
  • 在 Android 中自定义 Google SignInButton

    我想在 Android 中自定义 Google 登录按钮 目前我使用以下代码有一个非常基本的默认布局
  • 使用 SQL LAG 函数计算股票收益

    我有一张股票价格表 我正在尝试计算每日回报 Ticker Date price ABC 01 01 13 100 00 ABC 01 02 13 101 50 ABC 01 03 13 99 80 ABC 01 04 13 95 50 AB
  • struts2 中的日期验证

    我正在创建一个表单 用户将在其中注册 struts2 应用程序 用户需要输入特定格式的日期 由于我不打算使用 datepicker ajax 标签 因此我使用带有日期标签的文本字段 格式如下
  • 如何在 OS X 中获取当前前台应用程序的名称或 PID?

    我需要在 OS X 中获取当前前台应用程序的名称或 PID 如何使用终端获取它 您可以使用 lsappinfo 命令从终端找到此信息 手册页详细介绍了该工具可以返回的大量信息 为了获取最前面的应用程序 您可以使用 front 参数调用 ls
  • endl 操纵器在哪里定义

    我们知道endl是操纵器 它在内部放置 n 缓冲然后刷新缓冲区 哪里endl定义 什么是endl 是宏 函数 变量 类还是对象 我该如何定义自己的endl操纵者 cout lt lt hello lt lt endl what is end