enable_if:不带参数的 void 成员函数的最小示例

2024-01-10

我正在努力更好地理解std::enable_if在 C++11 中,并一直在尝试编写一个最小的示例:一个类A具有成员函数void foo()根据类型有不同的实现T来自类模板。
下面的代码给出了所需的结果,但我还没有完全理解它。为什么版本V2工作,但不V1?为什么是“冗余”类型U必需的?

#include <iostream>
#include <type_traits>

template <typename T>
class A {

    public:

        A(T x) : a_(x) {}

        // Enable this function if T == int
        /* V1 */ // template <           typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
        /* V2 */ template <typename U=T, typename std::enable_if<std::is_same<U,int>::value,int>::type = 0>
        void foo() { std::cout << "\nINT: " << a_ << "\n"; }

        // Enable this function if T == double
        template <typename U=T, typename std::enable_if<std::is_same<U,double>::value,int>::type = 0>
        void foo() { std::cout << "\nDOUBLE: " << a_ << "\n"; }

    private:

        T a_;

};

int main() {
    A<int> aInt(1); aInt.foo();
    A<double> aDouble(3.14); aDouble.foo();
    return 0;
}

是否有更好的方法来实现所需的结果,即有不同的实现void foo()基于类模板参数的函数?


我知道这不能完全回答您的问题,但它可能会给您更多的想法和理解如何使用std::enable_if.

您可以将 foo 成员函数替换为以下内容并具有相同的功能:

template<typename U=T> typename std::enable_if<std::is_same<U,int>::value>::type
foo(){ /* enabled when T is type int */ }

template<typename U=T> typename std::enable_if<std::is_same<U,double>::value>::type
foo(){ /* enabled when T is type double */ }

不久前,我对enable_if的工作原理有了很好的了解,但遗憾的是我忘记了它的大部分复杂性,只记得更实用的使用方法。

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

enable_if:不带参数的 void 成员函数的最小示例 的相关文章

随机推荐

  • Python,二维列表和坐标

    我有一个二维列表 def list list1 1 2 3 4 5 list2 0 0 0 0 0 list3 6 7 8 9 10 list list1 list2 list3 for i in list print i list 6 的
  • 如何从 Maven Java 项目加载外部属性文件

    我有一个 Maven Java 项目 其属性文件位于 src main resources 目录中 我打包了jar 但jar中没有属性文件 因此可以将其部署到具有不同设置的不同环境中 但单元测试失败 项目结构是 Properties App
  • asp.net core 1.0 web api使用camelcase

    On RC2相同的代码返回带有驼峰大小写的 json 格式 在 netcore 1 0 发布后 我开始了新项目 相同的代码以小写形式返回 json 尝试了多种解决方案 但没有一个有效web api serialize properties
  • 如何在 PHP 中反转多维数组

    反转多维数组的最简单方法是什么 我所说的反转是指与 array flip 类似 e g 0 5 var name data 0 3 var name2 data2 1 var name3 data3 0 1 4 var name4 data
  • 使用 webdriverjs 等待页面完全加载

    使用 JavaScript 的 selenium webdriver 等待页面完全加载的最佳方法是什么 我注意到这个问题 https stackoverflow com questions 5868439 wait for page loa
  • Java ExecutorService:我应该在使用execute之前加锁吗?

    我的班级组织如下 public class MyClass ExecutorService pool public MyClass pool inited by a class that implements ExecutorService
  • UIButton 过度敏感

    我在 tableviewCellWithReuseIdentifier 中定义了一个 UIButton 该按钮可以使用 但非常敏感 如果我只需点击按钮 它就会起作用 长时间按下它不会触发该操作 即使它确实闪烁表明它知道它被按下了 为什么会发
  • 移除观察员是强制性的(必要的)吗?

    有一个观察者 我在整个应用程序生命周期中都需要它 我应该删除它吗 我认为GC应用程序关闭后将删除它 对吗 如果是的话 我什么时候删除它 在deinit 如果您为 iOS 8 及之前版本提供支持 你必须移除里面的观察者dealloc or v
  • Google 地图实用程序 IOS Pod 错误

    我在使用 pod 将 Google Maps IOS 实用程序 用于标记聚类 添加到我的 swift xcode 项目中时遇到问题 当我跑步时pod install它失败并出现以下错误 Pods App 目标具有传递依赖关系 其中包括静态
  • 我的 IP 在 PHP 主服务器中显示错误

    好吧 足够简单 好吧 也许不是 我的 IP 目前是72 184 212 85然而 上面我在脚本的 IP 阻止系统上使用的代码将我的 IP 显示为我的家庭服务器 IP127 0 0 1 因此 当我转到脚本时 我的 IP 显示为127 0 0
  • 在 Android 上获取 OAuth2 令牌时 UNREGISTERED_ON_API_CONSOLE

    我们使用 Android Jellybean 及更高版本 并且我们有一个应用程序需要使用 OAuth2 与 Google 进行身份验证 我简化了登录活动 但它看起来像这样 AccountManager mAccountManager Acc
  • 在 npm 脚本中运行 2 个命令(nodemon && sass --watch)

    我有一个 package json 文件 如下所示 scripts test echo Error no test specified exit 1 start node src app js dev nodemon src app js
  • 我应该在 Windows 消息框中使用警告图标还是问号图标?

    许多人都知道MessageBoxIcon类型为 问题 如果你对这个图标不是特别熟悉 它只是一个美化的问号 我很好奇这个图标在专业应用程序中是否可以接受 例如 假设我有一个按钮 单击该按钮将清除整个表单上的所有文本字段 单击按钮时 我想警告用
  • 是否可以为气泡图制作图例?

    目前 互联网上没有使用 dc js 和 dc legend 函数的带有图例的气泡图的示例 that sessions scatterplot width 830 height 350 transitionDuration 1000 marg
  • 属性列表还是继承丛林?

    我有 2 个应用程序 我们称它们为 AppA 和 AppB 相互通信 AppA 正在向 AppB 发送对象 可能有不同的对象 AppB 并不支持每个对象 一个对象可以是一个模型 想象一下游戏 其中模型是车辆 房屋 人等 可能有不同的 App
  • 铬中的 SQLite

    是否可以制作像 Firefox 扩展一样与 sqlite 数据库交互的 chrome 扩展 您能给我一些建议或链接吗 哪里有关于开发与 sqlite 交互的 chrome 扩展的更多信息 谢谢 您可以使用网络 SQL API http de
  • 如何在 PrimeFaces 的工具提示上显示错误消息时摆脱空工具提示?

    我在某处显示错误消息
  • 如何在 R 中重置 par(mfrow)

    我设置了 par mfrow c 1 2 现在每次我绘制它时 它都会显示将其分成 2 个图 我怎样才能将其重置为仅显示一个图 非常感谢 您可以重置 mfrow 参数 par mfrow c 1 1
  • 阻止垃圾邮件发送者创建帐户(reCaptcha 不起作用)

    您好 我们刚刚在我们的电子邮件系统中注意到一堆尼日利亚垃圾邮件帐户 现在 我们的注册表单中确实有一个 reCaptcha 但显然他们手动或以其他方式绕过了它 这似乎是一种半手动规避 因为帐户不是批量创建的 而是以中间间隔几分钟的方式源源不断
  • enable_if:不带参数的 void 成员函数的最小示例

    我正在努力更好地理解std enable if在 C 11 中 并一直在尝试编写一个最小的示例 一个类A具有成员函数void foo 根据类型有不同的实现T来自类模板 下面的代码给出了所需的结果 但我还没有完全理解它 为什么版本V2工作 但