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 操纵器在哪里定义 的相关文章

  • 不允许从函数返回函数。我怎么能?

    8 3 5 8 Functions dcl fct says 函数的返回类型不得为 类型数组或function 尽管它们可能具有指针类型的返回类型或对此类事物的引用 为什么规则这么明确 是否有某种语法甚至允许返回函数而不是函数指针 我是否误
  • 如何在样式中访问控件父级的属性

    我的列表视图将项目数据模板化为标签 我正在为该标签设计一种样式 但我不知道如何访问父级的 ListViewItem IsSelected 属性 编辑 尝试了下面的建议 但仍然出现异常 这是我的完整代码
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令
  • C# 中的密码恢复工具不起作用

    嗨 我对此还很陌生 我创建了一个门户 用户可以登录并在其中查看我制作的其他程序 问题是密码恢复似乎不起作用 我没有收到任何错误消息 我只是收到消息 我们无法访问您的信息 请重试 我已经正确设置了 ASP NET 配置 并使用不同的用户和权限
  • 为什么仍然需要在 using 语句的 RHS 中使用 typename 来消除依赖类型的歧义?

    我很清楚为什么需要使用typename对于依赖类型 因为编译器在看到类似的内容时可能无法消除类型和变量声明之间的歧义T type 参见例如这个答案 https stackoverflow com a 613132 3093378一个很好的解
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • 如何在 MSBuild NuGet 包生成的 .nuspec 中注入自定义依赖项

    我正在尝试迁移到使用 MSBuildPack支持使用 csproj 生成项目 NuGet 包 其中在开发过程中使用本地 dll 来构建项目 但在使用 MSBuild 打包 项目时需要替换 交换它们以引用生成的 nuspec 中的外部 NuG
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • 在 C 或 C++ 中使用逗号作为宏名称

    我想做这样的事情 define define MAX 10 000 000 undef 有什么技巧可以做到吗 编辑 我知道 C 14 中的数字分隔符 我正在寻找一种技巧来对不兼容的编译器执行相同的操作 EDIT2 请考虑Variadic M
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 当数据源中只有 1 项时 FormView 不显示 PagerTemplate

    我有一个带有自定义 PagerTemplate 的 FormView 控件和我自己的分页 LinkBut ton 一切都很好 直到我加载的数据集仅包含一个记录 项目并完全隐藏 PagerTemplate 我在网上搜索了一下 找到了几个答案
  • 模板是如何实例化的?

    这是一个练习 来自C 入门第五版 练习 16 27 对于每个带标签的语句 解释什么 如果有 实例化发生 如果实例化了模板 请解释原因 如果 不 请解释为什么不 第677页 template
  • 如何将 MouseDown 事件放入样式中?

    这有效 XAML
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 为什么在嵌套类上调用方法时不调用父类的静态构造函数?

    给出以下代码 为什么在 Main 的第一行之后没有调用 Outer 的静态构造函数 namespace StaticTester class Program static void Main string args Outer Inner

随机推荐

  • 如何在 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