模板函数只匹配某些类型?

2024-03-16

我想定义一个函数模板:

template<typename T>
void foo(T arg)

但我想要T仅匹配某些类型。具体来说,T应该从某个基类派生(可能通过多重继承)。否则,该模板不应包含在重载集中。

我怎样才能做到这一点?


将 SFINAE 与std::is_base_of http://en.cppreference.com/w/cpp/types/is_base_of:

template <typename T,
          typename = std::enable_if_t<
              std::is_base_of<Foo, T>::value
          >>
void foo(T arg);

这将仅包括foo在过载集中如果T继承自Foo。请注意,这也包括不明确和无法访问的基础。如果您想要一个仅允许T继承的spublicly and 明确地 from Foo,那么你可以改用std::is_convertible http://en.cppreference.com/w/cpp/types/is_convertible:

template <typename T,
          typename = std::enable_if_t<
              std::is_convertible<T*, Foo*>::value
          >>
void foo(T arg);

注意论证的颠倒。

无论您选择哪种形式,为了简洁起见都可以使用别名:

template <typename T>
using enable_if_foo = std::enable_if_t<std::is_base_of<Foo, T>::value>;

template <typename T,
          typename = enable_if_foo<T>>
void foo(T arg);

这有效是因为std::enable_if http://en.cppreference.com/w/cpp/types/enable_if有一个名为的嵌套类型type当且仅当传入的布尔值是true. So if std::is_base_of<Foo, T>::value is true, enable_if_t被实例化为void,就好像我们写过:

template <typename T,
          typename = void>
void foo(T arg);

But, if T不继承自Foo,那么类型特征将评估为false, and std::enable_if_t<false>是替代失败 - 没有typename enable_if<false>::type。您可能认为这是一个编译错误,但是s代换failure is not an e错误(sfinae)。这只是模板推演失败而已。所以效果是这样的foo<T>在这种情况下,只是从可行的重载候选集合中删除,与任何其他模板推导失败没有什么不同。

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

模板函数只匹配某些类型? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp

随机推荐

  • 方法不会覆盖 Eclipse 中的包可见方法

    从 Eclipse Java 编译器设置 方法不会覆盖包可见方法 包默认方法在不同的包中不可见 因此无法被覆盖 启用此选项时 编译器会以错误或警告的形式发出此类情况的信号 如何触发此警告 错误 我正在寻找代码示例 Foo java pack
  • 替换 dplyr 链的所有列中的 NA

    问题替换 dplyr 链中的 NA https stackoverflow com questions 21714867 replace na in a dplyr chain结果转化为解决方案 dt group by a mutate b
  • Kotlin 中的静态扩展方法

    如何在 Kotlin 中定义静态扩展方法 这可能吗 我目前有一个扩展方法 如下所示 public fun Uber doMagic context Context 可以在实例上调用上述扩展 uberInstance doMagic cont
  • 如何让我的设备振动?

    我正在使用 AS3 为 Android 制作 Flash 游戏 我希望用户知道他通过使设备振动一秒钟来按下按钮 有人可以向我解释如何才能做到这一点吗 我是否需要导入特定的类以及代码应该是什么样子 提前致谢 要使用振动扩展 AIR 应用程序将
  • ASP.NET MVC 单向路由

    是否可以在 Asp net MVC 的 RouteCollection 中定义一个路由 以便它只执行 URL 重写 部分并忽略 Html Actionlink 的 URL 生成 事实上 我想在控制器和操作之间添加一个关键字 控制器 关键字
  • 如何在没有 XIB 的情况下将选项卡栏添加到现有视图控制器

    I m 尝试避免使用 Interface Builder越多越好 目前 我通过代码创建了视图控制器 并通过代码更改了视图 我现在需要其中一个步骤将应用程序发送到一个新的观点标签栏 这也将使我改变观点 理想情况下 我要做的就是告诉当前视图控制
  • 如何保持React状态与MySQL数据库同步

    Scene 我正在构建一个简单的日历 Web 应用程序 它使用 React 作为前端 使用 MySQL 作为服务器后端 该应用程序在首次安装时从服务器检索所有事件的列表 将它们显示给用户并允许进行 CRUD 操作 一切都按预期进行 Ques
  • 从 ExtJS 请求到 node.js 时出现 CORS 问题。请求或响应标头不正确?

    我在网络内两个不同域之间向 Nodejs 服务器发出 ExtJS AJAX 请求时遇到问题 非常感谢任何帮助 当尝试从 ExtJS 客户端的 http 和 https 时 响应失败 但我本地的 Curl 通过 http 返回 200 OK
  • 在.NET / Visual Studio中定义TRACE常量

    在 Visual Studio 2010 中 如果您转到项目的属性并转到 生成 选项卡 则会有一个 定义 TRACE 常量 复选框 这相当于执行 define TRACE System Diagnostics Trace 的所有方法都有一个
  • 如何在 Android 中发送 vcard/contacts/?vcf var SMS 或 MMS?

    我想修改可以发送 contacts vcard vcf 文件 的Android源代码 彩信或短信 Android默认方式是通过蓝牙 我找了很多方法 但都行不通 我知道vcf格式是这样的 BEGIN VCARD VERSION 2 1 N l
  • 如何为 HPA 自动缩放指标启用 KubeAPI 服务器

    我使用的是 Kube 版本 v1 13 0 由于 Heapster 从 v1 11 开始就被贬值了 所以我一直坚持启用集群 Metrics 的 API 服务器来实现 HPA root kubectl get pods deployment
  • 安装 JSTL 会导致 org.xml.sax.SAXParseException: Prolog 中不允许内容

    在我的应用程序中 我使用 JSTL 但是当我在 Tomcat 中部署应用程序时 出现以下错误 SEVERE Parse Fatal Error at line 1 column 1 Content is not allowed in pro
  • ImportError:无法从“google.cloud”导入名称“tasks_v2”

    我正在尝试使用 GCP 文档中提供的 Google Cloud Tasks 代码示例 https cloud google com tasks docs creating http target tasks https cloud goog
  • Python 的 csv.reader(filename) 真的返回列表吗?看来并非如此

    所以我仍在学习Python 并且今天正在学习如何读取文件 csv 文件 我刚刚观看的课程告诉我 使用 csv reader filename 返回一个列表 所以我写了下面的代码 import csv my file open file na
  • 如何用PHP制作计算器?

    我想使用 PHP 来计算简单的代数表达式 例如 8 5 1 通过输入
  • iOS 11(Beta)中的webKit支持WebRTC吗?

    我有一个 URL 可以在 iOS11 测试版 上的 Safari 上正常工作 音频 视频也可以正常工作 但是 当我使用 WKWebView 加载此 URL 时 它会给我一个错误 不兼容的浏览器 当我在 WebKit 中检查浏览器版本时 它会
  • 批处理文件命令 PAUSE 不起作用

    我正在创建一个简单的批处理文件来帮助完成一些事情 并且我还打印了一些说明 我希望用户在退出之前看到这些说明 目前 窗口关闭得很快 所以我添加了PAUSE在文件末尾 但它不想工作 我查看了有关 SO 的其他问题 并检查以确保行结尾是CRLF我
  • 实体框架中的类和接口层次结构?

    我有两个相关的类 它们共享一个公共接口 并且都存储在同一个基础数据库表中 然而 实体框架生成一个公共类 而我确实需要两个不同的类 我该如何解决这个问题 最好使用基类而不是接口吗 如何更改 EF 模型以提供映射到一张表的两个类 Edit Ac
  • 用于获取虚拟访客所有者的 Softlayer API

    是否有任何 API 可以获取虚拟访客的所有者 已配置虚拟访客的用户 我只能看到有权访问虚拟访客 API 的用户 Thanks 请使用过滤器尝试以下请求 https username apikey api softlayer com rest
  • 模板函数只匹配某些类型?

    我想定义一个函数模板 template