根据编译时常量禁用/隐藏模板中的函数

2024-04-16

是否可以使用编译时常量有条件地隐藏或禁用模板类中的函数?

想象一下下面的类:

template<size_t M, size_t N>
class MyClassT
{
    // I only want this function available if M == N, otherwise it is illegal to call
    static MyClassT<M, N> SomeFunc()
    {
        ...
    }
}


MyClassT<2,2>::SomeFunc(); // Fine
MyClassT<3,2>::SomeFunc(); // Shouldn't even compile

使用部分特化和继承:

// Factor common code in a base class
template <size_t n, size_t m>
class MyClassTBase
{
    // Put here the methods which must appear
    // in MyClassT independantly of n, m
};

// General case: no extra methods
template <size_t n, size_t m>
class MyClassT : MyClassTBase<n, m>
{};

// Special case: one extra method (you can add more here)
template <size_t n>
class MyClassT<n, n> : MyClassTBase<n, n>
{
    static MyClassT<n, n> SomeFunc()
    {
        ...
    }
};

另一种选择是使用 SFINAE:std::enable_if或其变体:

template <size_t n, size_t m>
class MyClassT
{
    template <typename EnableIf = char>
    static MyClassT<n, m> SomeFunc(EnableIf (*)[n == m] = 0)
    {
        ...
    }
};

更详细的替代方案(但如果您不了解 SFINAE 和指向数组的指针,就不那么令人惊讶)

template <size_t n, size_t m>
class MyClassT
{
    template <typename Dummy = char>
    static MyClassT<n, m>
    SomeFunc(typename std::enable_if<n == m, Dummy>::type * = 0)
    {
        ...
    }
};

一般来说,我更喜欢 SFINAE 方法,其中需要启用或禁用一两个成员函数。一旦它变得比这更复杂,我更喜欢部分专业化技术。

EDIT:SFINAE 代码是错误的,因为没有模板函数。已更正。

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

根据编译时常量禁用/隐藏模板中的函数 的相关文章

随机推荐

  • Eclipse 中是否有键盘快捷键可以折叠当前方法/块?

    问题说明了一切 我在 Eclipse v3 4 中打开了折叠功能 并且不必单击页面装订线中的小 我想知道是否有一个键盘快捷键 折叠当前方法 快速浏览一下 Eclipse 中的菜单和其他内容不会显示它的菜单项 所以也许您无法做到这一点 Any
  • SEO URL 重写 ASP.NET

    我已经有一个 ASP NET 网站 我想更改我的网站 使其对 SEO 网址更加友好 我想改变前任这个网站 www mydomain aspx articleID 5 到 www mydomain article learningURLrew
  • WiX 无法正确渲染图像

    我正在尝试编写一个自定义 WiX 对话框 作为其工作流程的一部分 它会根据某些条件显示错误图像 然而 WiX 似乎忽略了我的尺寸并按其感觉合适的方式显示 这是我的代码
  • 一起使用 MongoDB 和 Neo4j

    我正在开始一个新项目 我正在考虑使用 MongoDB 作为文档存储工具 使用 Neo4j 作为映射文档之间关系的机制 然后我想通过 REST API 公开查询结果 人们会说这样做的优点和缺点是什么 是否有更好的方法可以使用不同的 NoSQL
  • “无法从...初始化默认 wsdl”——为什么?

    My pom xml包含以下内容 用于自动为具有以下指定 WSDL 的工作 Web 服务生成客户端
  • 在bash中生成不重复的随机数序列

    今晚我一直在忙着学习 bash 我一直在尝试创建一个随机数字序列 该序列使用一个范围内的所有数字 并且每个数字只使用一次 因此 输入 1 5 的范围将输出 4 3 5 2 1 或 2 5 1 3 4 等 我在这件事上陷入了困境 Thanks
  • WordPress - 在侧边栏“最近的帖子”中显示特定类别的帖子

    如何使 WP 侧边栏中的 最近帖子 仅显示特定类别的帖子 使用 Otto 的 php 代码小部件之一制作您自己的最近帖子小部件可能是最简单的http wordpress org extend plugins php code widget
  • 如何使用 python 处理 dbus 接口的属性?

    我即将致力于实施mpris http mpris org 但目前我不知道如何使用 python dbus 读取 写入 dbus 接口属性 有这方面的例子吗 终于得到了答案 dbus service method dbus PROPERTIE
  • CSS 缩放不是模糊而是像素化

    我想在图像的 CSS 中使用缩放属性 但不希望对放大的图像产生模糊效果 而是像素化 我怎样才能实现这个目标 编辑 如果需要 可以使用其他属性或其他语言 您 当前 不能使用放大并指定浏览器应使用最近邻缩放 无论是 HTML 图像 放大的 HT
  • Javascript - 捕获对对象属性的访问[重复]

    这个问题在这里已经有答案了 是否可以捕获对象的 任何 属性被访问或尝试访问的时间 Example 我已经创建了自定义对象Foo var Foo function var self set a few properties return se
  • 将表行变成 Rails 中的链接

    我正在尝试在表中创建一行链接到编辑页面 我知道正在创建链接 因为我可以将它们打印出来 我很接近 但缺少一些重要的东西 我需要更改什么才能使链接正常工作 h1 Scouts h1 p p div class message board tab
  • PHP 时区 getTransitions 值得信赖吗?

    您是否曾经遇到过通过 getTransitions 函数进行 PHP 时区转换的任何问题 我正在尝试将阿根廷日期转换为 GMT 如果我查看转换数组 我会得到 63 gt Array ts gt 1287284400 time gt 2010
  • 使用“overflow: auto”滚动 div 的位置

    鉴于这个 HTML 片段 div style width 200px height 200px border 1px solid black 1 br 2 br 3 br 4 br 5 br 6 br 7 br 8 br 9 br 10 b
  • 在 xml 文件中写入一些字符,例如“<”

    自从我开始编程以来 我在为 Android 开发时在 Eclipse 中的 string xml 中使用了一些特殊字符 例如 一年来一切都运行良好 但今天 我只想做一些小的更改并开始编辑我的 xml 文件 我现在收到这些字符的编译错误 因为
  • 使用元类与多重继承相结合的类型错误

    我有两个关于数据类和多重继承的问题 第一个是 为什么我会收到该类的 TypeErrorDerived但不是为了Derived2 class Metaclass type pass class Klass object metaclass M
  • 文件下载已损坏

    我作为一名实验室讲师 试图通过将文件保留在 webroot 之上并强制他们登录 通过大学的 LDAP 进行身份验证 来确保我的学生无法过早下载他们的入门文件 验证它是否已经过版本然后 time 使用 readfile 向他们发送文件 不幸的
  • Python 中键为整数对的字典

    在Python中如何创建一个键为整数对的字典 例如 如果我这样做 mydict dict mydict 1 2 xxx 我收到错误TypeError unhashable type list 所以我想出了两种不同的解决方案 字符串或元组作为
  • Android 2.2 导致图片颜色失真?

    我的应用程序中有一些 png 文件 我需要在运行时加载这些 并从中获取某些像素的确切颜色 重要的是 我不想缩放这些图片 我不会直接在用户界面上显示它们 它们充当地图 现在 在Android 1 5上 这已经没有问题了 我将这些图像放在 re
  • 列出所有物理驱动器 (Windows)

    如何使用 C C 获取 Windows 计算机上的所有物理驱动器路径 PhysicalDriveX 答案在this https stackoverflow com questions 327718 how to list physical
  • 根据编译时常量禁用/隐藏模板中的函数

    是否可以使用编译时常量有条件地隐藏或禁用模板类中的函数 想象一下下面的类 template