std::enable_if 选择类别专业化

2023-12-02

我试图理解std::enable_if以及使用它的好处static_assert / regular template specialitzation.

阅读周围后我发现:

当不满足特定条件时,这对于在编译时隐藏签名很有用,因为在这种情况下,将不会定义成员enable_if::type,并且尝试使用它进行编译应该会失败。http://www.cplusplus.com/reference/type_traits/enable_if/

我的问题是:为什么编译器会责怪我说类 C 已经声明了?而一次应该只有一个声明可用。

class Interface{};

class Foo : public Interface{};

template <class T, typename = typename std::enable_if<std::is_base_of<Interface,T>::value>::type>
class C{
   // Some custom implementation
}

template <class T, typename = typename std::enable_if<!std::is_base_of<Interface,T>::value>::type>
class C { 
  //Some fallback / default implementation
}

int main() {
    C<Foo> myVariable;
}

Godbolt 中的相同行为:https://godbolt.org/z/cbfhG9q54

提前致谢!


你不能overload类模板就像函数模板一样,购买即可部分专业化它们(使用函数模板无法做到这一点):

#include <ios>
#include <iostream>
#include <type_traits>

class Interface
{};
class Foo : public Interface
{};

template <class T, typename = void>
struct C
{
    // Some default impl.
    static constexpr bool is_default_impl{true};
};

template <class T>
struct C<T, std::enable_if_t<std::is_base_of_v<Interface, T>>>
{
    // Some custom implementation.
    static constexpr bool is_default_impl{false};
};

int main()
{
    std::cout << std::boolalpha 
        << C<int>::is_default_impl << " "  // true
        << C<Foo>::is_default_impl;        // false
}

请注意,此示例需要 C++17 作为变量模板std::is_base_of_v这是一个简写常数value的成员std::is_base_ofTrait 和 C++14 用于别名模板std::enable_if_t,它的别名是type的成员别名声明std::enable_if trait.

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

std::enable_if 选择类别专业化 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

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

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • HTML5 是否使 Javascript 游戏更安全(更安全)?

    我知道 JavaScript 是一种极其不安全的持久游戏编程方式 例如 您在 RPG 中进行战斗计算 然后在获胜时通过链接到 PHP 页面来奖励 XP 该页面会将 XP 添加到数据库中 因为玩家可以制作自己的 javascript 来始终获
  • WPF 树数据模板取决于项目类型

    我有一个 MVVM WPF 应用程序 其中有一棵包含自引用数据的树 该数据通过分层转换器绑定到该树 如示例 http www telerik com help wpf radtreeview how to bind to self refe
  • Android WebView 与layer_type_software 不显示HTML5 画布内容

    自上次更新 Android WebView 以来 通过将 WebView 的图层类型设置为 View LAYER TYPE SOFTWARE 来禁用硬件加速时 带有 HTML5 画布的网页无法正确显示 这个问题有解决方法吗 当我省略以下 J
  • 构建 VSCode 和 Android Studio (Flutter) 的 gradle 时配置根项目“android”时出现问题

    今天开始学习Flutter 并成功下载了所有东西 但是当我运行我的应用程序时 调试器 两者VSCode and Android Studio 给我这个错误 Launching lib main dart on sdk gphone x86
  • 如何动态修改函数的本地命名空间?

    注意 这个问题假设 Python 2 7 3 我正在寻找一种合理的方法来动态修改函数的本地命名空间 最好以一种给函数体函数添加最少混乱的方式 我的想法是这样的 import os from namespace updater import
  • ggplot2时间序列数据在R中显示不稳定的线

    我想从此链接重现此图像 但我得到了这个奇怪的结果 这相当简单 我想从数据框中绘制时间序列 它不是 xts 类型的数据 这只是一个简单的数据框 日期已被识别为日期 不确定 为什么 ggplot 显示这种不稳定的线条而不是 geom line
  • 如何等待元素包含属性 style="display:none;"使用 Selenium 和 Python

    使用 Selenium Python 时 我需要等待 暂停直到 style display none 显示为 div div div gt 单击按钮后 将显示以下内容 加载中 div class notification info styl
  • 使用enable_if检查成员是否存在

    这就是我想做的 template
  • Equals 方法中浮点/双精度实例变量的相等比较是否应该准确?

    我正在重写对象的相等方法 假设里程表中的 km 变量存储为双精度型 以及一些对于示例而言并不重要的其他变量 public class Odometer private double km Override public int hashCo
  • 使用 IAM 角色凭证通过 Python 卸载到 S3

    在 Redshift 中 我运行以下命令将数据从表卸载到 S3 中的文件中 unload select from table to s3 bucket unload file iam role arn aws iam
  • Ruby 控制台输入在 1024 个字符处停止

    我有一个脚本 它将控制台输入接收到变量中 并需要粘贴长度超过 1024 个字符的字符串 当我尝试粘贴超过 1024 个字符时 它会在 1024 个字符之后停止接受输入 并且仅显示截断的字符串 手动输入字符也会达到此限制 我该如何解决这个问题
  • 在C#中通过POST发送JSON并接收返回的JSON?

    这是我第一次使用 JSON 以及System Net和WebRequest在我的任何应用程序中 我的应用程序应该向身份验证服务器发送一个 JSON 负载 类似于下面的负载 agent name Agent Name version 1 us
  • 如何在android中逐字搜索

    如何在字符串中搜索单词 例如 String text Samsung Galaxy S Two 如果我使用text contains 即使不是正确的单词 例如 Galaxy 中的 axy 它也会获得任何相关的字母 有什么建议或解决方案吗 L
  • 以编程方式设置 XtraReport 中查看器表单的标题

    有谁知道如何在显示 XtraReport 文档时设置表单查看器的标题 场景如下 我配置了 XtraReport 报告 调用 ShowPreviewDialog 方法显示它 查看器表单打开并显示文档 我需要为此查看器表单设置标题 但找不到完成
  • Converse.js 渲染到容器中

    是否可以配置 Converse js 将其框呈现为自定义div容器而不是将它们添加到页面正文中 是的 你可以通过写一个来做到这一点converse js 插件在其中你覆盖插入页面的方法ChatBoxView 请参阅我上面链接的插件文档 简而
  • 根据最新的 KeyStroke 填充 JTextField

    我的 UI 中的用例是填充两个JTextField基于双击项目的组件JList 最简单的是使用JCheckBox填充jTextField1如果选中该复选框 如果未选中则填充另一个复选框 反之亦然 这是完美的 但我想探讨是否可以在没有复选框的
  • WebDriver:executeScript() 导致 BindException

    javascripthere脚本位于Javascript 如何获取中断标签后面 前面的文本节点并用 ddb 标签包装它们 在跑步的时候 JavascriptExecutor driver executeScript javascripthe
  • MongoDB,正则表达式对索引字段的查询性能

    我想按名称查找帐户 在 50K 帐户的 MongoDB 集合中 按照通常的方式 我们用字符串找到 db accounts find name Jon Skeet indexes help improve performance 用正则表达式
  • Xcode 无法在 SVN 中获取新的类文件

    我有一个 SVN 存储库 我已从中更新了本地代码 并且此更新包含新的类文件 当我去构建时 由于 Xcode 中的文件中的代码已更新并引用了新文件 因此出现了链接器错误 该文件已添加到我在 Finder 中的目录 即我的本地文件系统是最新的
  • std::enable_if 选择类别专业化

    我试图理解std enable if以及使用它的好处static assert regular template specialitzation 阅读周围后我发现 当不满足特定条件时 这对于在编译时隐藏签名很有用 因为在这种情况下 将不会定