使用 SFINAE 检测相同的类继承

2024-02-11

我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同。似乎执行此操作的最有效方法是从一组类继承并检测是否存在错误。

问题是下面的代码编译失败,而我希望 SFINAE 能够工作。

Edit.问题不是“如何编写该元函数”,而是“如何捕获双重继承错误并输出false_type当它发生时”。据我所知,只有 SFINAE 才有可能实现。


template <typename T>
struct dummy {};

// error: duplicate base type ‘dummy<int>’ invalid
template <typename T, typename U>
struct fail : dummy<T>, dummy<U> {};

template <typename T>
true_type test(fail<T, T> a = fail<T, T>());

false_type test(...);

int main() {
    cout << decltype(test<int>())::value << endl;
}

现场版本在这里 http://ideone.com/22S50k.


Edit.以前我曾尝试在专业化失败的情况下执行此操作,但它也无法在相同的编译错误下工作。

template <typename T>
struct dummy {};

template <typename T, typename U>
struct fail : dummy<T>, dummy<U>, true_type {};

template <typename T, typename U = void>
struct test : false_type {};

template <typename T>
struct test<T, typename enable_if<fail<T, T>::value, void>::type> : true_type {};

现场版本在这里。 http://ideone.com/QN0SVE


您无法使用 SFINAE 捕获重复继承,因为它不是 14.8.2p8 下推导失败的列出原因之一[温度扣除];同样,这是因为错误发生在模板推导的“直接上下文”之外,因为它是实例化你的struct fail.

然而,有一种非常相似的技术适合您的情况,即检测模棱两可的转换从派生类到多个基类。显然,不明确的基类不能直接从单个派生类继承,但以线性链继承它们可以很好地工作:

C<> A<int>
|  /
C<int> A<char>
|     /
C<char, int> A<int>
|           /
C<int, char, int>

现在转换自C<int, char, int> to A<int>将是不明确的,并且作为不明确的转换is14.8.2p8下列出我们可以使用SFINAE来检测它:

#include <type_traits>

template<class> struct A {};
template<class... Ts> struct C;
template<> struct C<> {};
template<class T, class... Ts> struct C<T, Ts...>: A<T>, C<Ts...> {};
template<class... Ts> void f(A<Ts>...);
template<class... Ts> std::false_type g(...);
template<class... Ts> decltype(f((A<Ts>(), C<Ts...>())...), std::true_type()) g(int);
template<class... Ts> using distinct = decltype(g<Ts...>(0));

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

使用 SFINAE 检测相同的类继承 的相关文章

随机推荐

  • 使用 PORT=XXXX 启动节点永久脚本

    当通过特定端口运行节点命令时 我会这样启动应用程序 PORT 1234 node app js 我如何将端口传递给forever命令 无论我做什么 似乎都不想工作 我试过了 将端口作为参数传递 forever start app js 12
  • 循环浏览用户指定的根目录中的子文件夹和文件[重复]

    这个问题在这里已经有答案了 我通过各个文件的循环脚本工作正常 但我现在还需要它来查找多个目录 我被困住了 事情发生的顺序 提示用户选择他们需要的根目录 我需要脚本来查找该根目录中的任何文件夹 如果脚本找到一个 它将打开第一个 所有文件夹 因
  • 如何在Java中使用Graphics2D旋转文本?

    我想使用 Graphics2D 旋转 JPanel 上的文本 我的代码是这样的 double paso d width numeroBarras double alto datos i valor Font fBarras new Font
  • 在 MATLAB 中实现显式欧拉方法(适用于 ODE)

    我到处都找过了 但什么也没找到 首先 我想说我从未使用过 Mat Lab 所以我不知道我在做什么 我尝试了一些方法 但没有任何效果 显然 y 0 2 试图创建一个包含 0 个值为 2 的单位的列表 无论如何 有人可以帮助我吗 我需要在 Ma
  • 我们可以在透明窗口上应用着色器吗

    I am looking to apply a particular shader to a transparent window for example on a live desktop I want to create a trans
  • Perl XML::LibXML $node->findnodes($xpath) 找到它不应该找到的节点

    这是我遇到问题的一些代码 我处理一些 XML 并在 OO 类的方法中从文档中重复的几个节点中的每个节点提取一个元素 每个节点的子树中应该只有一个这样的元素 但我的代码获取所有元素 就好像它对整个文档进行操作一样 因为我只期望获得 oine
  • SSRS 报告显示为列出的目录

    如何获取 SSRS 报告以显示网页视图 当我转到 SSRS 报告页面时 它没有显示网页视图 它显示数据源 数据集和报告文件夹的列表 进入报告文件夹后 我可以通过单击它们来调用报告 没有任何问题 https docs google com f
  • 以分离模式启动的 docker 容器在进程执行后停止

    我使用以下命令以分离模式创建 docker 容器 docker run OPTIONS name my image d container name bin bash c opt init sh 所以我需要在创建的容器中执行 opt ini
  • 排序时保留 JSON 数组

    我有两个来自外部网站的 JSON 数组 我对两个数组进行排序和合并 对其进行解码 然后按 ID 从最高到最低对它们进行排序 目前 当单击 按字母顺序 选项时 sort alphabetical添加到 URL 的末尾 当页面完成重新加载时 J
  • 忽略 $Id 行的合并工具

    我需要合并一个分叉项目 不幸的是 CVS Id 行不同 因此我尝试的合并工具报告所有文件都不同 其中 95 只有这一行不同 是否有一个合并工具可以配置为忽略基于模式的行比较结果 编辑 我发现 WinMerge 有线路过滤器 正确设置它们实际
  • supertest的expect和then有什么区别?

    使用时supertest为了在 JavaScript 中测试异步 HTTP 请求 这两个片段有什么区别 其中一项是正确的 另一项是错误的吗 request http localhost 8080 get api people expect
  • 在 Fluent Migrator 中回滚到以前的版本

    我正在尝试使用流畅的迁移器来进行我的项目的迁移 但由于缺乏文档 我正在努力弄清楚如何回滚并拥有Down方法调用了我的迁移类 我使用初始版本 1 类设置了数据库 Migration 1 public class Baseline Migrat
  • Python:如何保存16位通道的图像(例如48 RGB)?

    我正在科学地处理显微镜图像 其中 3 个 RGB 通道均编码为 uint16 0 65536 目前 我使用 OpenCV2 和 NumPy 来处理图像 并使用标志 cv2 IMREAD UNCHANGED 读取一切正常 我可以对图像做一些工
  • 无法通过任何方式将 .h5 模型转换为 ONNX 进行推理

    我在 h5 中构建了一个自定义模型Matterport Mask RCNN 实现 https github com matterport Mask RCNN 我成功地保存了完整的模型 而不是单独使用的权重model keras model
  • 如何增加nest.js应用程序中的内存堆?如何在 cli 中使用 --max-old-space-size ?

    我正在使用 Nest js 框架开发 Node js 项目 但出现错误 JavaScript 堆内存不足 我的问题是如何为我的应用程序分配更多内存 我还发现有些人说我应该使用 max old space size 分配内存 所以我尝试将此选
  • 如何在实际需要 C# 静态类之前对其进行初始化?

    我有一个带有静态构造函数的静态类 需要一些时间 10 15 秒 来执行并完全初始化该类 为了提高性能 我决定让这个静态类显式初始化 而不是在第一次需要它时初始化 以便在实际需要使用时它就可以使用了 我的第一个想法是创建一个Initializ
  • 如何检查位图的颜色深度?

    我正在开发一个打印图像文件文件夹的应用程序 包括 JPEG 和 TIFF TIFF 图像通常是黑白 1bpp 加载图像后 我想确定图像是否是Color or B W or 灰度这样我就可以将图像发送到正确的打印机 彩色打印机或黑白打印机 我
  • 如何在 Jenkins 中创建用户并将其添加到组中进行身份验证?

    我选择使用 Jenkins 自己的用户数据库 安全领域进行用户登录 因为我无法在公司中使用 LDAP 当您决定将主机名或端口号更改为其他名称时 Google 的 OpenID 就会出现问题 为了安全起见 我使用 基于项目的矩阵授权策略 模式
  • 使用 Conda 环境、VS Code 终端和 Python 扩展 (v2023.16) 时,“.”插入到 PATH 环境变量中

    我正在尝试将 conda python 与 VS Code 一起使用 我在集成终端中使用的 shell 是 PowerShell 在 Windows 终端中一切正常 但在我重新启动 vscode 终端后 每个 conda 命令在 vscod
  • 使用 SFINAE 检测相同的类继承

    我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同 似乎执行此操作的最有效方法是从一组类继承并检测是否存在错误 问题是下面的代码编译失败 而我希望 SFINAE 能够工作 Edit 问题不是 如何编写该元函数 而是 如