默认模板参数在部分特化上下文中的作用

2024-02-04

我不清楚部分专业化背景下默认模板参数的交互,以选择哪个是更好的匹配模板。这个问题源于此中发布的代码answer https://stackoverflow.com/questions/52565407/use-of-enable-if-to-match-only-classes-which-have-a-certain-static-data-member由 max66 提供。

给定类的定义A and B:

template <int N> struct A { static const int code = N; };

struct B{};

以及以下模板类:

// primary template
template <typename, typename Enable = bool_constant<true>>
struct cond : public bool_constant<false> {};

// specialization
template <typename T>
struct cond<T, bool_constant<(0 == T::code)>> : public bool_constant<true> {};

1) cond<B>::value评估为false(即选择主要的)。这很明显,因为主模板产生cond<B, bool_constant<true>>,专业化失败,因此主模板是唯一可能的选择。

2) cond<A<0>>::value评估为true(即选择专业)。这很明显,因为主模板产生cond<B, bool_constant<true>>,专业化也产生cond<B, bool_constant<true>>,因此首选专业化,因为第二个模板参数的参数是明确给出的。

3) cond<A<1>>::value评估为false(即选择主要的)。我不清楚。主要模板产量cond<B, bool_constant<true>>,专业化收益率cond<B, bool_constant<false>>。鉴于第二个模板参数的参数在专业化中明确给出,为什么不是首选?

我认为 (3) 中的行为是由于主模板的默认模板参数和专业化之间的某些交互造成的。在这个answer https://stackoverflow.com/a/18701381/5800661杰里·科芬(Jerry Coffin)陈述了一些可以解释这种行为的内容:

如果我们改变专业化,使其专业化 适用于基本模板提供的默认类型以外的类型 然后将选择基本模板。

有人可以详细说明一下这条规则吗?谢谢


template <typename, typename Enable = bool_constant<true>>
struct cond : public bool_constant<false> {};

template <typename, typename Enable = bool_constant<true>> struct cond;

template <typename, typename Enable>
struct cond : public bool_constant<false> {};

稍后可能会更清楚地理解结果。

当你写的时候cond<C>,由于默认参数,它相当于cond<C, bool_constant<true>>.

然后我们尝试将其匹配到“更好的实例化”.

我们可以选择:

// primary template
template <typename, typename Enable>
struct cond : public bool_constant<false> {};

和部分专业化,使用 SFINAE:

// specialization
template <typename T>
struct cond<T, bool_constant<(0 == T::code)>> : public bool_constant<true> {};

If 0 == T::code格式不正确,专业化被丢弃,只有初级模板是可行的解决方案,因此使用它。

Else if 0 == T::code评估为false,专业化不匹配,并且还使用了主模板。
请注意,使用cond<C, bool_constant<false>>在这种情况下会使用专业化。

Else, 0 == T::code评估为true,那么primary和specialization都可行,但是specialization更专业,所以选择了。

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

默认模板参数在部分特化上下文中的作用 的相关文章

随机推荐

  • Linux 上的 Squeak SMTP

    我正在使用 Squeak 5 类 SecureSMTPClient 通过 SSL TLS 发送电子邮件 它在我的 Windows 机器上运行良好 感谢答案那个问题 https stackoverflow com questions 3761
  • 使用可变长度数组有任何开销吗?

    使用可变长度数组有一些开销吗 数组的大小可以在运行时通过命令行参数传递吗 与自动和动态分配数组相比 为什么要引入它 VLA 确实有一些开销 与 普通 命名的编译时大小的数组相比 首先 它具有运行时长度 而且该语言为您提供了在运行时获取数组实
  • 从返回响应数据的 Fetch Post 获取数据

    我在带有 redux 的 React 应用程序中使用交叉获取 在我的减速器中 我使用 cross fetch 的 post 方法将一些数据保存到数据库中 我的调用返回一个响应 其中包含一些我需要在保存后分配给状态的数据 但我在解析数据时遇到
  • 当我直到运行时才知道长度时,如何声明数组?

    我最初有一个数组 1 1000 它被定义为全局变量 但现在我需要它是 n 而不是 1000 直到后来我才找到 n 在填充数组之前我知道 n 是什么 但我需要它是全局的 因此需要一种在运行时定义全局数组的大小的方法 上下文是通过文件中字节的线
  • 电话号码中的正则表达式可选空格[重复]

    这个问题在这里已经有答案了 可能的重复 用于电话号码验证的综合正则表达式 https stackoverflow com questions 123559 a comprehensive regex for phone number val
  • Pig 和 Hive 之间的区别?为什么两者都有? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的背景 进入 Hadoop 世界已经 4 周了 使用 Cloudera 的 Hadoop VM 涉足 Hive Pig 和 Hadoop 读过
  • 片段着色器 - 确定整个(单色)图像的最小/最大值并使用它们进行进一步的像素操作

    我想正常化单色图像像素以这种方式最小值为黑色 最大值为白色 并且两者之间的值按比例分布 目前我在 canvas 中分两步完成 但我相信在 WebGL 中应该更快 我可以想象通过片段着色器操纵颜色 但我找不到任何有效的方法来 1 确定图像的实
  • 如何在 IE11 中显示 html5 视频元素的控件?

    IE11 也可能是 10 不会显示视频控件 直到您将鼠标悬停在视频本身上 就我个人而言 我认为完全没有用 特别是当您也使用海报元素时 因为用户无法知道图像实际上是视频 有没有办法像 Chrome 一样 强制 IE 显示控件 我使用的代码是
  • ServiceStack CredentialAuthProvider 具有多个用户/密码

    我想使用自定义身份验证提供程序 但我不知道如何使标准身份验证内容处理更多用户和密码作为参数 这可以做到吗 取决于您想要做什么 如果您想通过继承 Credentials AuthProvider 创建自己的自定义身份验证提供程序 您可以通过以
  • 获取c++ windows中每个进程使用的磁盘

    I am trying to build a tool which is something similar to Task Manager I was able to get the CPU and Memory of each proc
  • Xcode 中的 XCBUtil.PropertyListConversionError

    当我尝试运行我的项目时 出现此错误 指向我的本地化 strings 文件 读取失败 操作无法完成 XCBUtil PropertyListConversionError错误1 我可以做什么来解决这个问题 错误所指向的 string 文件内存
  • 计算子集的唯一交集

    Given a set S si zj z N what is a time efficient algorithm for computing the unique sets of intersections of the subsets
  • Ivy:使用动态修订

    我在理解如何使用动态修订版时遇到问题Ivy http ant apache org ivy 在我的 Java 项目中有效 目前 我有以下布局 lib a revision 1 0 0 status release dependencies
  • Powershell启动作业同步输出

    我有一个启动作业的 powershell 脚本 start job scriptblock while true echo Running Start Sleep 2 然后它继续执行脚本的其余部分 该工作是一种对该进程 PID 的监控工作
  • Apache 用户帐户无密码访问服务器 - Ubuntu

    我有同样的问题this https stackoverflow com questions 9089350 rsync via php exec with ssh passwordless ssh login问题 如果我再解释一遍 我可以使
  • 前向声明类成员的前向声明

    是否可以前向声明一个在另一个前向声明的类中声明的类 基本上 我有这样的东西 A h class A struct B 现在我想声明另一个这样的类 Q h class A struct A B class Q A B Foo 不 这是不可能的
  • 在 WordPress 中获取类别 ID 数组?

    cats get categories array order gt ASC orderby gt id hierarchical gt 0 hide empty gt 0 taxonomy gt edu year 我想生成一个变量 其中包
  • 当作为 *.a 静态库链接时,为什么“WinMain”无法解析?

    给定一个简单的程序 include
  • 如何将 PHPUnit 与 CodeIgniter 结合使用?

    我读过并阅读过有关 PHPUnit SimpleTest 和其他单元测试框架的文章 他们听起来都很棒 我终于让 PHPUnit 与 Codeigniter 一起工作了 感谢https bitbucket org kenjis my ciun
  • 默认模板参数在部分特化上下文中的作用

    我不清楚部分专业化背景下默认模板参数的交互 以选择哪个是更好的匹配模板 这个问题源于此中发布的代码answer https stackoverflow com questions 52565407 use of enable if to m