检查可变参数模板中没有重复类型的 C++ 概念

2023-11-30

我试图弄清楚如何编写一个概念来检查可变参数模板中没有重复的类型。

我知道我不能在其内部递归地调用一个概念,但如果可以的话,我的解决方案将如下所示(忽略缺乏停止条件):

#include <concepts>

template <class TYPE, class ... TYPE_LIST>
concept is_not_in_list = ((!std::same_as<TYPE, TYPE_LIST>) && ...);

template <class FIRST_TYPE_IN_LIST, class ... REST_OF_TYPE_LIST>
concept is_non_repeating_list_ = (_type_not_in_list_<FIRST_TYPE_IN_LIST, REST_OF_TYPE_LIST> && is_non_repeating_list<REST_OF_TYPE_LIST>);

// Usage

template<is_non_repeating_list ... TYPE_LIST>
class MyClass {}

我在标准库中找不到类型特征或概念来帮助我解决这个问题。有什么想法吗?


您可能尝试解决此问题的大多数方法都无法根据类型列表的长度进行缩放 - 编译时间将是二次或更糟,并且天真地遍历包而不是使用折叠表达式很容易使包的长度成为立方。

这是在编译时执行此操作的一种方法,该方法仅随包长度线性增长,假设std::make_index_sequence<N>最坏情况下是线性的N:

#include <utility>

template<typename T> struct type_base {};
template<int N, typename T> struct indexed_type_base : type_base<T> {};
template<typename Indexes, typename ...T> struct indexed_types;
template<std::size_t ...Indexes, typename ...T>
struct indexed_types<std::index_sequence<Indexes...>, T...> : indexed_type_base<Indexes, T>... {};

template<typename ...T>
concept is_non_repeating_list =
    std::is_standard_layout_v<indexed_types<std::make_index_sequence<sizeof...(T)>, T...>>;

这里的技巧是indexed_types是标准布局类类型当且仅当其所有基类都是不同类型时,当且仅当类型包不包含重复项时才会发生这种情况。基类的索引序列和额外层仅用于避免indexed_types包含重复的直接基类,这是格式错误的。

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

检查可变参数模板中没有重复类型的 C++ 概念 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 为什么编译器支持冗余作用域限定,它合法吗?

    我在两个编译器上进行了测试 并惊讶地发现两者都支持以下内容定义无怨无悔 class A A A A A 请注意 这对于方法也是成功的 尽管当声明过度限定时会被标记 问题 这是一个有效的 C 程序吗 如果是这样 它有什么目的 或者只是一个副产
  • NoSuchWindowError:浏览上下文已被 GeckoDriver Firefox 和 Protractor(Selenium) 丢弃

    我正在尝试使用量角器运行一个简单的测试脚本 环境 Node Version v9 8 0 Protractor Version 5 4 1 Angular Version 1 x Browser s Mozilla Firefox 60 1
  • \npm\node_modules\vs-mda\vs-cli 未被识别为内部或外部命令

    安装了混合应用 CTP 下载了 Backbone 示例 将我的构建设置为 Windows Phone 和模拟器 720 P 并尝试构建 我收到此错误 1 gt Build started Project BackboneTodo Confi
  • 获取每个值的分位数

    R 中是否有一个实现的 函数可以为您提供每个值的经验分位数 我找不到任何 假设我们有 x x c 1 3 4 2 我想要每个元素的分位数 1 0 25 0 75 1 0 5 您可以使用ecdf 功能 ecdf x x 1 0 25 0 75
  • 直线与曲线之间的面积(无功能)

    我想计算橙色线和蓝色线之间的面积 我设法遮蔽了该区域 但我不知道如何应用trapz函数来获取面积 在这篇文章中 两条曲线之间的曲面下面积我得到了一些解决方案 但我没有曲线的具体方程 只是图本身 橙色线的代码是 x 1 0 M1 1 y 1
  • SmartGWT RestDataSource

    我正在使用 SmartGWT SmartClient LGPL 由于项目关系 我无法使用 Pro 我想从 jdbc 连接创建一个 RestDataSource 以便从服务器公开给 SmartGWT 客户端 怎么可能呢 任何帮助是极大的赞赏
  • SSDT、SSDT-BI 不同 SQL 版本的向后兼容性混乱

    在谷歌上广泛搜索不同 SQL Server 版本的 SSDT 和 SSDT BI 后 我希望有人能够找出差异并澄清我混乱的想法 Aim To upgradeSSIS 包从 sql server 2012 到 sql server 2014
  • GLCM 结果中的黑线

    这是GLCM矩阵的结果 GLCM图像中的黑色水平线和垂直线是什么意思 他们有问题吗 N numel unique img img is uint8 glcm graycomatrix img NumLevels N imshow glcm
  • 自定义 Jasper 报告甘特图上的日期

    在我的报告的甘特图中 我有 1 年的数据 我只对查看甘特图顶部打印的月份感兴趣 一月至十二月 但是 该图表当前显示月份和年份 我如何自定义图表以仅输出月份 我不确定贾斯珀报告 but createGanttChart uses a Date
  • Java 机器人 Azerty 与 Qwerty

    我希望这不是重复的 但我已经浏览了论坛 但尚未找到任何答案 我的 java 应用程序使用 Robot 类输入文本时遇到问题 提供文本并由应用程序将其打印出来 当用户使用 QWERTY 键盘时 一切正常 当用户使用 AZERTY 键盘时 值将
  • MVC 和 Razor 中 Html.TextboxFor 和 Html.EditorFor 的区别

    为什么在添加新的 编辑 视图时默认情况下这些会发生变化 使用时有什么优势EditorFor vs TextboxFor 我找到了这个 默认情况下 创建和编辑支架现在使用 Html EditorFor 帮助器而不是 Html TextBoxF
  • 每 1 秒调用一次函数(精确地)

    我正在用 C 编写一个简单的游戏模拟程序 有一个名为 update 的函数可以更新游戏的当前状态 必须每 1 秒精确调用一次 如果我使用这样的循环 while some condition update Sleep 1000 那么该函数就不
  • 我们如何使用 Python 去除字符串开头的标点符号?

    我想使用 Python 去除字符串开头的各种标点符号 我的list包含字符串 其中一些以某种标点符号开头 如何从字符串中删除所有类型的标点符号 例如 如果我的话是这样的 gets 我想脱 从这个词来看 我想要gets作为结果 另外我也想脱掉
  • 创建旋转表面

    我有一个磁盘的 3D 图 代码如下 ri 100 ra 300 h 20 input xy coordinates xy np array ri 0 ra 0 ra h ri h ri 0 radial component is x val
  • 运行 React Native 入门项目时发生 TransformError (iOS)

    我在运行 React Native Getting Started 项目时遇到问题 我遵循了这个指南 https facebook github io react native docs getting started html 当我尝试从
  • Groovy - 将一个对象的属性绑定到另一个对象

    有没有一种方法可以将一个类的一个实例的属性绑定到另一个类的实例的属性 两者之间的公共字段 请参阅下面的示例 class One String foo String bar class Two String foo String bar St
  • 是否可以为Android相机预览提供类似顶点着色器和片段着色器的效果,并使用OpenGLES保存捕获的图像?

    这两个是我的VertexShader和Fragment Shader文件 顶点着色器文件 attribute vec4 position attribute vec4 inputTextureCoordinate varying vec2
  • 如何从子类调用基类的 __init__ 方法? [复制]

    这个问题在这里已经有答案了 如果我有一个 python 类 class BaseClass object code and the init function of the base class 然后我定义一个子类 例如 class Chi
  • MySQL 排列

    我有两张桌子 一个有产品 另一个有与之配套的捆绑包 我需要弄清楚 SQL 它可以让我找到可以销售带有附加产品的产品的所有组合 Products Name ID Bench 1 Extra Name ID Parent ID QTY unde
  • 检查可变参数模板中没有重复类型的 C++ 概念

    我试图弄清楚如何编写一个概念来检查可变参数模板中没有重复的类型 我知道我不能在其内部递归地调用一个概念 但如果可以的话 我的解决方案将如下所示 忽略缺乏停止条件 include