C++ 折叠表达式可变参数模板

2024-02-10

我正在读一本关于模板的书。有一段示例代码,使用折叠表达式使用运算符 ->* 遍历二叉树中的路径:

// define binary tree structure and traverse helpers:
struct Node {
  int value;
  Node* left;
  Node* right;
  Node(int i=0) : value(i), left(nullptr), right(nullptr) {
  }
  //...
};
auto left = &Node::left;
auto right = &Node::right;

// traverse tree, using fold expression:
template<typename T, typename... TP>
Node* traverse (T np, TP... paths) {
  return (np ->* ... ->* paths);      // np ->* paths1 ->* paths2 ...
}

int main()
{
  // init binary tree structure:
  Node* root = new Node{0};
  root->left = new Node{1};
  root->left->right = new Node{2};
  //...
  // traverse binary tree:
  Node* node = traverse(root, left, right);
  //...
}

我不太明白这句话

auto left = &Node::left;
auto right = &Node::right;

因为我曾经认为应用于类的 :: 运算符只会引用其静态成员,也许在这种情况下我错了,而且我确实知道 :: 是范围解析运算符,它可能引用 Node 的 left 无论如何,即使它不是static ,但是为什么它可以使用 & 运算符来获取它的地址呢?实际上,我在考虑的是,这只是一个别名吗

using left = &Node::left; // can't compile

只有在以下情况下才有效

auto left = &Node::left;

auto 的结果是什么?这个表达式的显式类型?

注意:这里使用的是全局的left和right

Node* node = traverse(root, left, right);

这是 main 中的最后一行。

我尝试运行它,一切正常,但我不太明白,它是如何工作的?


的类型left and right is

Node* Node::*left

一个案例指向类数据成员的指针 https://stackoverflow.com/questions/670734/c-pointer-to-class-data-member。你可以想象它编码的偏移量left 在代表范围内的未指定实例Node,而不是内存中的固定位置。仅当提供此实例时才能取消引用,

node.*left

(给一个Node*)或者在你的情况下,根是(普通)指针本身,

root->*left.

这就是这条线

return (np ->* ... ->* paths);

展开到.

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

C++ 折叠表达式可变参数模板 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 格式说明符%02x

    我有一个简单的程序 include
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L

随机推荐

  • Python lxml解析svg文件

    我正在尝试解析 svg 文件http kanjivg tagaini net http kanjivg tagaini net 但我无法成功提取里面的信息 Edit 1 完整文件 http www filedropper com 0f9ab
  • IBM data studio 未连接到本地 DB2 数据库

    我已经在本地 Ubuntu 12 04 机器上安装了 DB2 10 5 版本 现在我需要一个图形用户界面 我已经尝试过 squirrel sql 和 Db Visualizer Db Visualizer 为我提供了仅查看的数据库结构 而
  • 一个项目有两个 gitlab-ci 运行程序

    我曾经在github上有一个项目travis https travis ci org and an appveyor https www appveyor com 已配置集成服务 因此我能够确保我的项目在两个平台上都可以正常编译OSX an
  • 使用协程API获取实体

    最好的使用方法是什么coroutines使用 LiveData 从数据库中选择一些数据Room 这是 My Dao 课程 暂停选择 Dao interface UserDao Query SELECT from user table WHE
  • 如何使用 --split-debug-info=/<项目名称>/<目录>

    下面的命令中 如何使用 split debug info
  • C++ 对齐的未来:按值传递?

    阅读 Eigen 库文档 我注意到有些对象不能按值传递 http eigen tuxfamily org dox TopicPassingByValue html C 11 中是否有任何开发或计划开发可以安全地按值传递此类对象 另外 为什么
  • SharedPreferences 保存一个按钮,单击它后将其更改为不可见,并让另一个按钮出现

    我是新来的 我是法国人 所以也许我的英语不是很好 对此感到抱歉 我是 Android 开发的初学者 我必须创建一个应用程序来完成我的学习 我有一个名为 VoeuxActivity java 的活动编号 1 有 8 个按钮 和 8 个 Tex
  • Actionscript 3 和动态蒙版

    我有一个容器 MovieClip 用作我需要遮盖的内容区域 当我使用形状在此容器内创建蒙版时 我似乎无法与我在此处创建的其他容器的内容进行交互 例如按钮等 这就是我在代码中所做的 我省略了所有导入等 class MyContainer ex
  • C++ 中不同字符串类型的优缺点

    很抱歉在 SO 上开始另一个无法回答的问题 但我只是好奇 C 中所有不同字符串类型的优缺点 我的具体问题是 MFC 的 CStrings 和 std string 之间的问题 因为我只做 Windows 软件 但这将扩展到 C 中的任何字符
  • 使用 Swift 4 解析 JSON 数据数组

    我正在使用以下代码 仅当 JSON 数据不以 字符开头时 它才有效 它适用于以 字符开头的 JSON 数据 这里有一个类似的问题 快速解析 JSON 数组 https stackoverflow com questions 26840203
  • 如何访问mapGroupsWithState中的stateSnapshot或在流之间共享GroupState?

    通过 DStream API 可以使用以下命令访问有状态流的快照状态MapWithStateDStream stateSnapshots http spark apache org docs latest api scala index h
  • 无法远程调试 IIS - w3wp.exe 呈灰色显示

    我正在尝试使用远程调试来调试 IIS Web 服务 由于我们的域配置 我们无法更改 当通过 默认 选项进行远程调试时 我收到 访问被拒绝 的消息 我找到的唯一解决方案是切换到 VS 2008 中的远程 仅本机 无需身份验证 选项 问题是 当
  • JavaScript 中的插值

    我有这个jQuery http en wikipedia org wiki JQuery code selector html a href url text a where url and text是 JavaScript 变量 我将如何
  • 如何使 Visual Studio 2015 C++ 项目与 Visual Studio 2010 兼容?

    我的老师被学校安排使用 Visual Studio 2010 因为他们不想费心安装任何新东西 我一直在使用 Visual Studio 2015 并且非常喜欢它 然而 当她尝试运行任何代码时 都会产生一堆错误 我尝试了一种通过编辑解决方案文
  • 在创建新的 Android 文件项目后,我在 Eclipse 中没有原始文件夹。我能做些什么?

    抱歉 我是一名初学者程序员 我现在只学习 Android Java 特定语言 我有一本书 我想学习 但是当我制作新项目时没有原始文件夹 我怎样才能做到呢 还是我之前删除了 我不知道 因为我只是尝试发现 Eclipse IDE 并且我犯了一些
  • 如何保留嵌入的制表符

    EDIT 2019 Oct 11 Simple example 删除了前面的示例 I want awk尊重一个TAB嵌入的字符 0当它重新处理时作为内容 0字段值更改后的输入记录 1 2 这是一个简短的例子 在下面的输出中 t 48 例如
  • RshinyDashboard自定义框状态颜色

    我想自定义闪亮应用程序的框状态颜色 我找到了一种 css 方法来更改这些框的框背景颜色 但不自定义状态颜色 但我在 css 中没有看到 status 的等效参数 因此 我打印了一个简单页面的源代码 其中包含所考虑的参数 status 并且我
  • dplyr:将所有列发送到 group_by 之后的 mutate 内的函数

    在 dplyr 管道中调用任意函数时 将当前组中的所有列作为 tibble 或 data frame 发送到函数的首选方法是什么 在下面的例子中 mean B是一个简单的例子 我知道在调用函数之前需要什么 mean B fun给出了错误的答
  • ASP.Net:写入文件块..HTTP 文件上传与恢复

    请参考问题 恢复上传文件控制 https stackoverflow com questions 2062852 resume in upload file control 现在为了找到上述问题的解决方案 我想研究它并开发一个可以恢复 HT
  • C++ 折叠表达式可变参数模板

    我正在读一本关于模板的书 有一段示例代码 使用折叠表达式使用运算符 gt 遍历二叉树中的路径 define binary tree structure and traverse helpers struct Node int value N