C++ 中如何解析嵌套模板?

2024-02-06

我最近问了一个关于确定迭代器在编译时是否指向复数值的问题,并收到了有效的答案。

问题在这里:如何专门针对指向复数值的迭代器的算法? https://stackoverflow.com/questions/59954327/how-can-i-specialize-an-algorithm-for-iterators-that-point-to-complex-values

解决方案是一组模板,用于确定一个模板是否是另一个模板的特化:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

这确实有效,但我真的很难理解它是如何工作的。特别是嵌套的template在一个template让我感到困惑。我对使用可变参数模板还相当陌生,并且没有提供类型的可变参数模板似乎很奇怪,例如:<class...>而不是这样的东西<class... Args>.

有人可以分解这个模板并描述它是如何解决的吗?


您必须考虑到模板参数分为三种类型:

1) types

2)非类型(或值)

3) 模板-模板

第一种类型前面是typename (or class)

template <typename T>
void foo (T const & t);

在前面的例子中,T是一个类型并且t(经典函数参数)是类型的值T.

模板参数的第二种类型是值,前面是值的类型(或auto,从 C++17 开始,对于未指定类型)

template <int I>
void bar ()
 { std::cout << I << std::endl; }

在前面的示例中I模板参数是类型的值int.

第三种类型是解释起来最复杂的。

你知道吗(我想)std::vector<int> and std::vector<double>是不同的类型,但它们有共同点std::vector,一个模板类。

模板-模板参数是接受的参数std::vector,不带参数的模板类。

模板-模板参数前面有一个template关键字,如下例所示

template <template <int> class C>
void baz ();

模板-模板参数C在前面的示例中,类(或结构)需要单个int(值)模板参数。

所以如果你有课

template <int I>
class getInt
 { };

你可以通过getInt,作为模板参数,baz()

baz<getInt>();

现在您应该能够理解您的代码:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

the is_specializationstruct 是一个模板结构,它接收类型 (T) 和一个模板-模板Template接受接收可变数量的类型模板参数的类/结构。

现在你有一个专业is_specialization:

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

当第一个模板参数 (Template<Args...>) 是基于第二个 (Template).

一个例子:如果你实例化

is_specialization<std::vector<int>, std::map>

主版本(继承自std::false_type) 被选择是因为std::vector<int>不是基于std::map.

但是如果你实例化

is_specialization<std::vector<int>, std::vector>

专业化(继承自std::true_type) 被选择是因为std::vector<int>是基于std::vector.

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

C++ 中如何解析嵌套模板? 的相关文章

  • 在 VBA 中从范围创建数组

    我遇到了一个看似基本的问题 但找不到任何资源来解决它 简而言之 我只想将一系列单元格 所有一列 的内容加载到数组中 我能够通过以下方式完成此任务 DirArray Array Range A1 Range A2 但由于某种原因 我无法以这种
  • 为什么 epmd 进程不退出?

    在我退出 erlang shell 后 epmd 进程仍然存在 这是一个错误还是一个功能 这是很正常的 EPMD 是一个主机守护进程 当人们打算使用分布式节点时 就需要它的存在 当仅在同一台机器上使用多个节点时 它也很有用
  • “反序列化操作回复消息正文时出错...” - 对于我调用的每个方法

    我正在尝试为我们的波兰拍卖服务 Allegro 创建非常简单的客户端应用程序 他们提供 SOAP 架构中的 API 问题是 每次我尝试调用任何方法时 我都会收到 反序列化操作 方法名称 的回复消息正文时出错 一般来说 我对网络服务不熟悉 所
  • 根据值合并行(pandas 到 excel - xlsxwriter)- 加法

    跟进这个问题 https stackoverflow com questions 61217923 merge rows based on value pandas to excel xlsxwriter 61228294 noredire
  • 为我的应用程序需要与之通信的每一台主机使用一个 HttpClient 实例是否可以?

    我知道 当使用 Microsoft 依赖注入容器时 处理 HttpClient 实例的最佳实践是使用IHttpClientFactory接口 https github com aspnet Extensions blob master sr
  • 不是 select 中带有 MAX 的单组组函数

    Select sg gameno Max sg Year sg end sg hostcity country olympic name from Summergames s Country co where s country isoco
  • 为网格注入浏览器前缀不适用于 Vue

    我已经在这件事上浪费了一个下午的时间了 我被难住了 我发现IE11不支持grid template我需要使用 ms grid columns and ms grid rows相反 我正在尝试生成一些 CSS 并通过 Vue 方法注入它 这适
  • 在 NodeJS 中运行 Conda 命令

    我无法使用以下命令运行 C onda 命令exec与我的 NodeJS 应用程序 var conda path miniconda3 bin conda var cmd conda path init bash conda path act
  • Django Widget Media 不起作用

    我需要一个小部件 它应该只显示一个块 因为我将使用 jQuery 添加功能 我试图通过 Widget 的 Media 类包含 javascript 和样式表 但它对我不起作用 这是代码 class StarsWidget Widget Wi
  • 将 JasperServer“嵌入”外部 Web 应用程序?

    有什么方法可以将 JasperServer 集成 嵌入到另一个 Web 应用程序中吗 问题是 JasperServer 的登录页面应该以某种方式绕过 是否可以通过 Web 服务 REST 进行身份验证 跳过登录页面 然后显示主服务器页面if
  • Dojo 控制台错误对象为空

    突然间 Dojo 来自 Google CDN 的 1 8 3 抛出空错误 这使得调试变得异常困难 例如 如果我忘记require在使用它之前 我会得到通常的依赖 gt dojo parser parse error ReferenceErr
  • 如何使用 Microsoft Kinect for Windows SDK 版本 1.7 C# 检测张开/闭合的手

    我最近开始使用 Microsoft Kinect for Windows SDK 来使用 Kinect 设备来编程一些东西 我正在竭尽全力寻找一种方法来检测某只手是闭合还是打开 我看到了 Kinect for Windows Toolkit
  • ServiceStack支持反向路由吗?

    遵循 REST 建议 API 是可发现的并且应该相互链接 ServiceStack 是否支持任何类型的反向路由 我正在寻找类似的东西Url RouteLink在 ASP MVC 中 这里陈述了一些混合概念 在尝试遵守 REST 的过程中 您
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • AS3 内存泄漏示例

    有人可以发布一个 as3 代码的示例 特别是包括事件侦听器 这将是一个可能泄漏内存的简单示例 也希望您能发布所显示问题的解决方案吗 问题是 AS3 事件监听器中内存泄漏的一个简单示例是什么 如何解决它 public class MySpri
  • 如何指定 AsRef 的生命周期?

    我正在尝试编写一个函数来连接两个可迭代对象 其项目可以转换为OsStr引用 并且在尝试指定引用的生命周期时遇到了巨大的困难 use std convert AsRef use std ffi OsStr use std marker Pha
  • 使用 matplotlib 同时绘制两个直方图时,不透明度会产生误导

    假设我有两个直方图 我使用 hist 参数设置不透明度 alpha 0 5 我绘制了两个直方图 但我得到了三种颜色 我理解从不透明的角度来看这是有道理的 但 向某人展示具有三种颜色的两个事物的图表会让人非常困惑 我可以以某种方式将每个垃圾箱
  • 为什么 Sleep() 会使后续代码减慢 40 毫秒?

    我最初是在 coderanch com 上询问这个问题的 所以如果您尝试在那里帮助我 谢谢 并且不必重复这个努力 不过 coderanch com 主要是一个 Java 社区 而且 经过一些研究 这似乎确实是一个 Windows 问题 因此
  • 执行命令后如何保持 sbt 运行(作为守护进程)

    我想从 sbt 启动 scalatra 服务器 我怎么做 以下命令启动 scalatra sbt container start 但它立即退出 info starting server success Total time 2 s comp

随机推荐