根据 C++ 标准的定义实现“is_similar”类型特征

2024-01-07

我正在尝试实施一个is_similar基于标准给出的定义的类型特征(详细信息here http://eel.is/c++draft/conv.qual#2):

两种类型T1 and T2如果它们具有 cv 分解,则它们是相似的 与相同的n使得对应的Pi组件是 相同或一个是“数组Ni”另一个是“未知数组 的界限”,以及由 表示的类型U是相同的。

但是,我不确定确切地理解它的含义以及如何实现它:

template <class T, class U, class = void>
struct is_similar_base: std::false_type {};

template <class T, class U>
struct is_similar_base<T, U, /* ??? */ >: std::true_type {};

template <class T, class U>
struct is_similar: is_similar_base<T, U> {};

template <class T, class U>
inline constexpr bool is_similar_v = is_similar<T, U>::value;

欢迎任何帮助。


CV 分解将类型“剥离”为交替的层const/volatile限定符和指针/数组间接寻址。如果指针/数组间接寻址相同(允许“未知边界的数组”与“未知数组的数组”匹配,则类型相似)n") 并且下面的类型是否相同(忽略 cv 限定符)。

So,

// every type is similar to itself
template<typename T, typename U>
struct is_similar_impl : std::is_same<T, U> { };
// we don't care about cv-qualifiers
template<typename T, typename U>
struct is_similar : is_similar_impl<std::remove_cv_t<T>, std::remove_cv_t<U>> { };
// peeling off different kinds of pointers/arrays
template<typename T, typename U>
struct is_similar_impl<T*, U*> : is_similar<T, U> { };
template<typename C, typename T, typename U>
struct is_similar_impl<T C::*, U C::*> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[N]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[], U[N]> : is_similar<T, U> { };

template<typename T, typename U>
constexpr inline bool is_similar_v = is_similar<T, U>::value;

Godbolt 和测试用例 https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAM1QDsCBlZAQwBtMQBGAFlICsupVs1qhkAUgBMAISnTSAZ0ztkBPHUqZa6AMKpWAVwC2tQVvQAZPLUwA5YwCNMxENwAMpAA6oFhdbT1DE0FvXzU6Kxt7IycXd0VlTFV/BgJmYgJA41NOBJVw2lT0gki7R2cQAGYATkU0jKzg3IV6kusymIqagEpFVANiZA4AcilK62RDLABqcUqddRbiTGYjOexxNwBBMYmpzFn5petgdc2dyXHaSYMZuZ0CAE9PTAB9AmJmQgUz7fOAen%2B00wADdnI9pk8XtM8Appr4jHhhMRIagYQQlKwqOcCJgjJ5hLj7lCtKsDgAVUiQ56kowHACqvy2SwMqhhCleCKR6VeeHxrGmIHhBHQIBAsM5ZPulOmjMq2FmAHZpEqACJzWTbQHTADuB3QdDAwwI0xYy2mzAc/RNyBBAFoAI4GNh4Kh4Zw/ba4/nMInzEm0MnTGUBoNyjbbFlsiVc5GC9mcvnc4i8/n3FqikDLIyoMGvW3vaXrKkZsXZ3NvAsEe7h9ZKlXiRXqyqarbal7KE7TVBUKjTfC95xaE0Aa2s6DhPem3msuOICn%2B6U%2Bj09W29BN9mGJNMDdODVNDe9rkY%2BrJNMaTyNTBOlACoqfTb3WhRfEcjpQ%2B642G02NTi8RufoPDuQY6AeIF7iGEEMkyUbnhysY8nyN7zOS0w6GK96yuhmHPgmiHEB%2Bspfsqap/l6AGEluRwimKvgAF5vCatjgS8u4UqxtIwfK5xwfhl5IWmqHiAArNItiiaqn5iRJInNgqL4IQJhGoZ%2B8r1mRLb/j6QGliADFMdMLHUmxQZQaZR6wae0ZKW%2BgkoTo5KieJknSbIcl4a%2ByZEeGGmNs2rbrlR6a0fpeCMe8Rmcex%2B4mVxxE8SexBnvxdkpshrBFmJrnETJkmebZ3mqQlCrfpprbaYB1HARZHFxTFx5bGgtAtJgAAengotYrDtNMVr6KlyavCChyqoN77FeGYogmwBjURV2yztMRhfLQEDdPW5zTNtwqZmgBjVtsO3HYcOj3ONPIgvcs5UrOX7zOdUiSKJOi0E90zao8mCridO33OdXlXld8w3dMVCsKgvr3Wd8yzJIz0ia973arQqBbb9p0A4VQPXfQpp0C0t14yC%2Bi%2Bki1GlQ9sNPS9b3wx9QJfT9GP/bDgOXbjNoEwQVLg5DJok4S5PQ498O08jQKo%2Bjv2szoF0psDCz0FhS3NS0T7qbLcMI0j9Ofd90snVr7MK5zWF876GuUzDcs04jdOSAz0xS0dLNU3LJvDfcJN4Og0wQLe3QQLOgdUj7fsB0Havnsr3Qi9TYv2xLztohABrfSnJrMJ4BIQkQYMGNcBQWsQwDGMOChx67Mvu/LXsg3jemwh8KxGJhRMmnpPgt6suGa7Xdu647KOpzYmB%2B/nTiQggBwKEGkzMAoleG8dxvYxzDed6F3fLL3IBPmJCNSTCjfb0sre4dlHn9zb2vi3rjMG9XRu157isrxjqvcwHgtk%2BwEB6WOKITC0dpi/zUOwOOYlKiSSge5KSH9fpLXAeTAO0cAGhSAaAfecCYFyTgdwfKN9RY6wdk7JmiDMZs3XqbB6z8MYny5i1AgP9SYQMwBgzMWCQHczAWw8muDYHOREq5Shx1kH8P/redBgCPgnEwoI/BzlCHX2tiQ%2B%2Bz0WxO1Rv7JczAVzO0wOPVEfVZ5BgMlXHYTZhi9FYCAYYIlhikFMMMNwTjUD2LOjIOQ8J%2BiDAOGMTgTiCD2Lcd0XoI4QAADZqgADo3BRKiQADiiZIKJbhOBuEkCkqJQh7HcCcS4txpAPHDCcQoEAHgQmuJsaQOAsAkDtSSAdEg5BKDpGAAoAACiIZQDAECoB1C4oJpA0D4m5AUHpNhWD9MGUUpxYzPDkxcAvUQmS3AeEWcsgA8gdWZQzQlOKacgLYpcKllNIMc1I%2BAXFOJoPQJgbAOA8H4IIYQwCJDeJkEIPADgKmQF6KgTwBRzl2gAOpsAFHaDMcxVSfNkDITgipyl%2BKGIIDM1gpl9IGQc4YQTbH2Mcc4w5JT7FtRSXaKJ3BTTvOANMTJ8T4nTGwG1ZpRAUQQFwIQEgcNKicA2l4hF0hgmHPCaQGezAsAuHWqQSJlQ3CxOqJUPllRFQ1CSdURUnBKjcEqHk4YBTiU1NJRcipVTRUEuGJIQpJLSkipqWKsE85/CuCAA%3D%3D%3D

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

根据 C++ 标准的定义实现“is_similar”类型特征 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似

随机推荐