如何测试类型是否是具有非类型参数的模板的特化?

2023-11-26

我想知道是否有任何解决方案来查找类型是否是采用非类型参数而不指定每种类型的模板的特化?

例如,如果有一个这样的类:

template<typename T, std::size_t R>
struct F {}

现在,我正在使用一个非常专业的特征:

template<template<typename, std::size_t> class TT, typename T>
struct is_2 : std::false_type { };

template<template<typename, std::size_t> class TT, typename V1, std::size_t R>
struct is_2<TT, TT<V1, R>> : std::true_type { };

并像这样使用is_2<F, T>::value。然而,这是不切实际的,因为如果您添加另一个模板参数,则必须编辑您的特征。此外,如果您有多个此类模板,则需要为每个模板编写一个特征。

有没有办法让东西变得更实用呢?我可以使用 C++14。我并不是说使用宏来减少代码量。


非类型模板参数有点像红头发的继子。

不存在“任何模板参数匹配,无论类型与否”。

如果可以修改F,您可以通过将常量包装在精简类型中来使其更加统一。所以:

template<typename T, class R>
struct F;

template<typename T, std::size_t R>
struct F<T, std::integral_constant<std::size_t, R>> {};

现在元程序就像is可以统一写为:

template<template<class...>class Template, class T>
struct is_instantiation : std::false_type {};
template<template<class...>class Template, class... Ts>
struct is_instantiation<Template, Template<Ts...>> : std::true_type {};

匹配一切。

如果你的控制能力较差F,您可以使用您的方法,或者编写元程序来提升template和一个例子template变成带有类型包装器的东西。

struct meta_F {
  template<class T, std::size_t R>using raw_apply=F<T,R>;
  template<class T, class R>using apply=raw_apply<T,R::value_type>;
};

template<class meta_Template, class... Args>
struct type_lifted_template {};

template<class T, std::size_t R>
struct type_lifted_template< meta_F, T, std::integral_constant<std::size_t, R> > {
  using result = meta_F::template raw_apply<T, R>;
};

template<class T, std::size_t R>
auto type_lift_instance( F<T,R> )
-> type_lifted_template< meta_F, T, std::integral_constant<std::size_t, R> >;

Now, type_lift_instance可以专门针对多种类型,并且有些decltype魔法可以用来提取type_lifted_template针对不同类型进行专业化。

所有这一切都非常粗糙。如果您要在模板上进行大量元编程,那么您最好只让模板采用统一的类型参数,而不是乱搞这些东西。

template<class meta_F, class C>
struct meta_template_is_lifted : std::false_type {};
template<class meta_F, class...Ts>
struct meta_template_is_lifted<meta_F, type_lifted_template< meta_F, Ts... >> : std::true_type {};

template<class meta_F, class C>
struct meta_template_is : meta_template_is_lifted< meta_F, decltype(type_lift_instance( std::declval<C>() ) ) > {};

这并没有减少多少打字,但是元化仍在远离is代码(或其他类似代码)。

我可能错误地使用了“lift”。

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

如何测试类型是否是具有非类型参数的模板的特化? 的相关文章

  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 在 Twig 的父作用域中设置变量

    在Smarty你可以做 var bla scope parent 在 Twig 中可能吗 不建议使用块 我知道 我需要变量 如果您不想使用default 过滤器 即 当您想在整个父模板和子模板中多次使用该变量时 您实际上可以在父模板中定义一
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • .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++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 导入项目出现无法解析目标“android-7”

    这个应用程序是我大约一年前完成的 但从未在市场上发布过 我现在尝试在 Eclipse 中打开它 进行一些小的修改并对代码进行一些处理 所以我导入了它 然后发现了这个奇怪的 无法解析目标 错误 它在我所有的 src 文件中突出显示了每个类的红
  • 为什么我无法使用 Type.InvokeMember 检索 out 或 ref 类型的参数值?

    标题很长 但我希望它具体一些 标题确实是个问题 尽管该方法InvokeMember正在呼叫有一个out参数并正在为该参数分配一个值 但我无法获取该值 这是我最初使用的代码 string parameter int result Conver
  • IE9 中的条件样式表

    IE9 应该支持条件注释 我有正确的 MIME 类型 type text css 所有其他条件样式表都被读入正确的浏览器 这是我无法阅读的内容 它与其他部分一起位于 head 中 但在 IE9 中不会出现在 head 中 对于愚蠢的问题感到
  • 使用 Firebase,Swift removeObserver(withHandle 不会删除观察者

    使用 Swift 3 中的removeObserver withHandle 观察者不会在 viewDidDisappear 上删除 var query FIRDatabaseQuery var postRef FIRDatabaseRef
  • Rails:模型实例方法还是辅助方法?

    按照惯例 以下内容应该定义为我的模型的实例方法还是辅助方法 app models user rb class User lt ActiveRecord Base def full name first name last name end
  • 超媒体与 Servicestack 新 API 链接

    我正在评估如何向 DTO 响应添加超媒体链接 虽然没有标准 但将 List 添加到响应 DTO 似乎是建议的方法 您知道使用ServiceStack框架实现的示例或参考吗 添加列表对我来说没问题 但我的疑问是在哪里放置以下链接的逻辑 在服务
  • WPF:在 TreeViewItem 中正确存储对象

    为了将对象 例如 类的实例 存储在 TreeViewItem 中 我当前将该对象存储在TreeViewItem s Header然后覆盖ToString该类的方法 以便它显示正确的字符串标题 然后我在事件期间将对象投射回来 这是实现这种事情
  • Fortran 中何处放置“隐式无”

    我需要放implicit none在每个函数和子程序中 或者将其放在包含这些函数和子例程的模块的开头就足够了吗 或者将其放在使用这些模块的程序的开头就足够了吗 通过观察别人的工作代码 implicit none包含在所有这些地方 我不确定这
  • React Hooks 的 Keydown/up 事件无法正常工作

    我正在尝试为我正在开发的游戏创建基于箭头的键盘控件 当然 我想跟上 React 的最新动态 所以我想创建一个函数组件并使用钩子 我创建了一个JSFiddle对于我的越野车组件 它几乎按预期工作 除非我同时按下很多箭头键 然后好像有一些key
  • 在 tidyr/dplyr 中添加零计数行的正确习惯用法

    假设我有一些如下所示的计数数据 library tidyr library dplyr X raw lt data frame x as factor c A A A B B B y as factor c i ii ii i i i z
  • Java 和无符号值

    我正在解析 DatagramSocket 中的无符号位 我总共有 24 位 或 3 个字节 进来 它们是 1 个无符号 8 位整数 后跟一个 16 位有符号整数 但是java从来不会将除了有符号字节之外的任何东西存储到字节 字节数组中 当j
  • 无法刷新hangfire仪表板中的统计信息

    我的网站在同一台服务器上使用hangfire 运行 Hangfire 仪表板在本地运行良好 但是 当我访问http localhost hangfire recurring在服务器计算机上 它报告此错误 Unable to refresh
  • bash文本搜索:查找一个文件的内容是否存在于另一个文件中[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 假设我们有两个文件 a txt 和 b txt 每个文件都有多行文本 如何编写一个shell脚本来检查b txt中是否存在a txt的所有内容 感谢各位的提示 我没有注意到 q
  • 将 3 字节立体声 WAV 文件转换为 numpy 数组

    我收到了一个连续水下录音的大型 WAV 文件 我想将其转换为 numpy 数组进行分析 我正在努力做到这一点 到目前为止我有 import numpy as np import scipy as sp import wave as wv i
  • 从 VB.NET 编码过渡到 C# 的好练习吗?

    中级 高级 VB NET Web 程序员应该做哪些练习来掌握 C 语法 我想一些很好的例子是 运行全部 C 语法的算法或项目练习 参考资料 VB NET 程序员应注意的主要语法差异列表 我认为最好的锻炼就是为自己创造一些东西 通过这种方式
  • 是否有任何 Python IDE 可以像 R 一样让您运行选定的代码? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我认为这对于初学者来说是一
  • 在 Swift 中,为什么子类方法不能覆盖超类中协议扩展提供的方法

    我知道这个问题的标题很令人困惑 但奇怪的行为在下面的示例中进行了解释 protocol Protocol func method gt String extension Protocol func method gt String retu
  • BadImageFormatException 调试以 x64 模式运行的网站

    这个论坛里有很多关于这个的问题BadImageFormatException 但没有一个完全符合我的问题 我有一个包含多个项目的解决方案 当我在 调试 或 发布 任何 CPU 中运行时 一切正常 然而 当我切换到 x64 并运行我的 ASP
  • 运行 AspectJ 会导致 NoSuchMethodError: Aspect.aspectOf

    我有一个非常简单的 AspectJ 方面 使用 AspectJ 它只打印出一条日志消息 我的目标是在我的 Android 应用程序中提供建议代码 现在 只要我的应用程序源代码中有方面类本身 这个方面就可以完美地工作 一旦我将方面移动到不同的
  • 如何测试类型是否是具有非类型参数的模板的特化?

    我想知道是否有任何解决方案来查找类型是否是采用非类型参数而不指定每种类型的模板的特化 例如 如果有一个这样的类 template