SFINAE 在返回类型中工作,但不作为模板参数[重复]

2024-07-01

我已经使用过 SFINAE 习语很多次了,而且我习惯了把我的std::enable_if<>在模板参数中而不是在返回类型中。然而,我遇到了一些微不足道的情况,它不起作用,我不知道为什么。首先,这是我的主要内容:

int main()
{
    foo(5);
    foo(3.4);
}

这是一个实现foo触发错误:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
    -> void
{
    std::cout << "I'm an integer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
    -> void
{
    std::cout << "I'm a floating point number!\n";
}

这是一段据称等效的代码,可以正常工作:

template<typename T>
auto foo(T)
    -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T)
    -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}

我的问题是:为什么第一次执行foo触发该错误而第二个错误不触发它?

main.cpp:14:6: error: redefinition of 'template<class T, class> void foo(T)'
 auto foo(T)
      ^
main.cpp:6:6: note: 'template<class T, class> void foo(T)' previously declared here
 auto foo(T)
      ^
main.cpp: In function 'int main()':
main.cpp:23:12: error: no matching function for call to 'foo(double)'
     foo(3.4);
            ^
main.cpp:6:6: note: candidate: template<class T, class> void foo(T)
 auto foo(T)
      ^
main.cpp:6:6: note:   template argument deduction/substitution failed:
main.cpp:5:10: error: no type named 'type' in 'struct std::enable_if<false, void>'
          typename = typename std::enable_if<std::is_integral<T>::value>::type>
          ^

EDIT :

工作代码 http://coliru.stacked-crooked.com/a/69673770917ff0e6 and 有错误的代码 http://coliru.stacked-crooked.com/a/e43f8c05fecb9b50.


你应该看看14.5.6.1 Function template overloading(C++11 标准)其中定义了函数模板等效性。简而言之,不考虑默认模板参数,因此在第一种情况下,您定义了两次相同的函数模板。在第二种情况下,您有引用返回类型中使用的模板参数的表达式(再次参见 14.5.6.1/4)。由于此表达式是签名的一部分,因此您将获得两个不同的函数模板声明,因此 SFINAE 有机会工作。

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

SFINAE 在返回类型中工作,但不作为模板参数[重复] 的相关文章

  • 格式化具有 X 位小数和 InvariantCulture 的数字?

    我想使用格式化数字ToString CultureInfo InvariantCulture 并且精确到小数点后 5 位 这可以使用ToString N5 我怎样才能同时做这两件事 怎么样使用重载既需要格式又需要文化 http msdn m
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 规避模板专业化

    假设我是某个模板库的用户 CTL 它定义了一个模板 命名为 Hector template
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 安装 Windows 服务以使用 ServiceAccount.User 在用户凭据下运行,但不提示

    我创建了一个 C Windows 服务及其随附的用于创建安装程序的 Visual Studio 安装项目 它成功安装了该服务 当我从枚举中选择任何值时ServiceAccount除了ServiceAccount User 该服务安装时不会提
  • “constexpr”有什么用?

    我实在是找不到它有什么用处 我的第一个想法是我可以用它来实现 按合同设计 而不使用如下宏 struct S S constexpr int i S i static assert i lt 9 i must be lt 9 S int i
  • elmah定制提供商及暴露事件

    我想知道如何创建自定义提供程序来存储错误日志 例如 Windows 事件查看器的提供者 如果到目前为止不可能 我还想知道是否有任何可以覆盖的公开事件 以便我可以注入我的代码 获取异常 做任何我想做的事情 我知道 Global asax 中有
  • Windows窗体C#通过代码改变用户控件

    我有一个 Windows 窗体 我不想将任何其他 Windows 窗体设置为一个 Windows 窗体和不同的用户控件 如何在用户控件之间进行更改 例如以编程方式隐藏一个用户控件并显示另一个用户控件 private void Btt inf
  • 如何在C++中从Imagemagick图像获取缓冲区

    我正在使用 ImageMagick 库进行图像处理 我需要加载 bmp 图像 将其转换为 jpeg 将其加载到缓冲区中并通过网络发送 但是 我在 ImageMagick 中找不到任何可以在缓冲区中转换和存储数据的支持函数 我只能写入文件 尝
  • 使用 X509 证书对多个收件人进行 XML 加密和解密

    我已经成功地使用 MSDN 上的示例来加密和解密 xml 文档 http msdn microsoft com en us library ms229744 aspx http msdn microsoft com en us librar
  • 如何从 C 函数中返回多个值?

    如果我有一个产生结果的函数int和一个结果string 如何从函数中返回它们 据我所知 我只能返回一件事 这是由函数名称前面的类型决定的 我不知道你的是什么string是的 但我假设它管理自己的内存 您有两种解决方案 1 返回一个struc
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 仅仅“抛出”一次捕获有好处吗?

    与一位同事就他将大部分功能包装在 try catch 中的做法进行了 激烈辩论 但 catch 中只有一个 抛出 例如 Private sub foo try Do something catch throw And nothing els
  • 双击 C# 中的 Windows 窗体

    如何检测哪个鼠标按钮双击了表单 即左键 右键或中键 Updated 我使用的是 NET2 0 将最后点击的按钮存储在MouseUp事件 然后在双击事件中检查该事件 示例代码 MouseButtons lastButtonUp MouseBu
  • 如何在预处理器中检测X32 ABI或环境?

    X32是一个 ABIamd64 x86 64使用 32 位指针的 CPU 这个想法是将 x86 64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来 它可提供高达约 40 的加速 看x86 x32 和 x64 架构之间的
  • Sharepoint 客户端 GetFolderByServerRelativeUrl 文件夹修改日期

    我试图在使用 GetFolderByServerRelativeUrl 函数时检索文件夹的 修改日期 和 创建日期 我该怎么做 我只能从中获取relativeUrl 和文件夹名称 下面是我为检索文件夹所做的操作 请帮忙 FolderColl
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格
  • 如何使用 gcc 的 -I 命令添加递归文件夹

    有没有办法使用 gcc 的 I 命令并通过给出 a 将所有路径添加到搜索路径root目录 我正在尝试使用 gcc E myfile c查看宏展开式 但是myfile c包含不同目录中的一大堆其他头文件 并且因为我在 vim 中执行此命令 所
  • 跨 Web 服务列表<国家/地区> 变为国家/地区 []

    我有一个 Web 服务 调用时会返回一个包含多态列表的 Result 对象 但是 当我在客户端应用程序中添加引用时 公共字段将成为客户端应用程序中的国家 地区数组 如何将客户端应用程序中的字段更改为列表 public Result GetC
  • 解析日期时间字符串

    我在使用 DateTime ParseExact 解析 DateTime 字符串时遇到一些困难 DateTime result CultureInfo provider CultureInfo InvariantCulture Parse

随机推荐

  • 可视化链接攻击的最佳方式是什么

    我有一个如下图所示的 Networkx 图 我执行边缘攻击并观察结果子图的节点处的值的变化 例子 如果我攻击边 a 2 边 a 2 和 2 1 将被移除 解释一下 当边 a 2 受到攻击时 节点 2 的度数将 上述攻击会产生一个子图 每一条
  • 如何在选项卡视图控制器故事板应用程序中添加更多选项卡? [复制]

    这个问题在这里已经有答案了 可能的重复 Xcode 4 2 选项卡式应用程序 添加新选项卡视图 https stackoverflow com questions 7952576 xcode 4 2 tabbed application a
  • 如何以编程方式创建触发器对象?

    我正在使用 Springquartz Scheduler 但我没有使用 XML 文件 我想以编程方式创建整个配置 我编写了以下代码 package com eaportal service impl import java text Par
  • 使用 GitLab CI 在本地运行测试?

    如果在 GitLab CI 上配置了 GitLab 项目 是否有办法在本地运行构建 我不想将我的笔记本电脑变成构建 运行者 我只是想利用 Docker 和 gitlab ci yml在本地运行测试 即全部预先配置 这样做的另一个优点是我确信
  • 获取Java InputStream后面的文件的字节数

    正如标题所示 我需要知道文件在输入流 后面 有多少字节 我不想下载所有字节和计数 需要很长时间 我只需要知道文件有多少字节 像这样 int numberOfBytes countBytes inputStream 所以 我需要 countB
  • Haskell - 计算列表中每个不同元素出现的次数

    我是 Haskell 的新手 只是想编写一个列表理解来计算列表中每个不同值的频率 但我在最后一部分遇到了麻烦 到目前为止我有这个 frequency Eq a gt a gt Int a frequency list count y lis
  • 如何使用 css3 动画将宽度和高度设置为 100%?

    我有以下代码 HTML div div css div background tomato width 100px height 100px webkit animation animateThis 0 3s ease in webkit
  • 无法远程连接JMX?

    由于某些奇怪的原因 我无法使用VisualVM or jconsole到 JMX 用于启动要监控的VM的参数 Dcom sun management jmxremote Dcom sun management jmxremote authe
  • 默认情况下,所有 Google Chrome 扩展程序都是开源的吗?

    我想知道如果我编写了 Google Chrome 扩展程序 任何人都可以使用我的代码吗 看起来人们将能够看到您的代码 如果他们可以看到您的代码 他们就有可能使用它 视窗 C Documents and Settings USERNAME L
  • 如何在 PL/SQL 中解析逗号分隔的字符串? [复制]

    这个问题在这里已经有答案了 我在 PL SQL 脚本中有一个逗号分隔的字符串 例如 data a b c d e 我需要在脚本中解析它 我想循环遍历字符串并处理每个项目 就像 foreach 循环一样 这在 PL SQL 中可能吗 有人可以
  • 如何从一个活动组中的活动导航到android中的另一个活动

    我有两个标签 在这两个选项卡中我有不同的活动组 如何从一个活动组中的一个活动导航到android中的另一个活动 请帮我举出合适的例子 就我而言 我确实喜欢这样 当我单击父组最后一个活动中的完成 提交按钮时 我提交了值 将值存储到服务器 数据
  • 在 PHP 中格式化 JSON 格式的文本文件

    所以我得到了一个带有按钮的 HTML 页面 当我单击该按钮时 一个单独的 javascript 文件会向我的 PHP 文件发送 GET 请求 并期望返回 JSON 对象 我的 PHP 读取 JSON 格式的文本文件 并将其转换为 JSONO
  • ASP.NET身份更改密码

    我需要能够由管理员更改用户密码 因此 管理员不应输入用户的当前密码 他应该能够设置新密码 我查看了 ChangePasswordAsync 方法 但该方法需要输入旧密码 因此 此方法不适合此任务 因此我通过以下方式做到了 HttpPost
  • 在 App Store 上发布应用程序后,iAd 未在设备上显示

    检查了有关在 App Store 上发布应用程序后不显示 iAd 的几个问题 对 iAd 进行所有必要的设置 测试广告在模拟器和设备中显示良好 然后发布应用程序并为该应用程序启用 iAd 网络 在iAd Network部分 状态显示为 Li
  • Xcode 4:如何更改 ${EXECUTABLE_NAME} 变量的值?

    我想找到 xcode 4 2 中定义的 EXECUTABLE NAME 全局变量在哪里 您的目标 gt 构建设置 gt 产品名称
  • RSpec 中“it”关键字的作用是什么?

    我正在关注rails3tutorial 在进行如下测试时 我不明白 it 关键字的含义 require spec helper describe UsersController do render views describe GET ne
  • 在android中绘制单点触摸运动路径

    我正在尝试制作一个绘图应用程序 我想要绘制单点触摸运动路径在 android 中 就像 Swype 键盘的方式一样 因此我想存储每个像素的 x y 坐标将运动路径转化为数据结构 我如何使用 MotionEvent 指针来执行此操作 您可能不
  • 使用自定义源增强 Iostreams zlib_error

    我正在尝试使用zlib decompressor通过一个解压缩数据istreambuf iterator 我找不到使用输入迭代器作为流的输入的内置方法 如果已经存在 请指出一种方法 所以我写了这个源代码 template
  • JDK:如何以编程方式启用 PlatformLogger

    我需要以编程方式启用某些 JDK7 内部类的日志记录 这就是我在应用程序初始化时所做的事情 httpLogger Logger getLogger sun net www protocol http HttpURLConnection ht
  • SFINAE 在返回类型中工作,但不作为模板参数[重复]

    这个问题在这里已经有答案了 我已经使用过 SFINAE 习语很多次了 而且我习惯了把我的std enable if lt gt 在模板参数中而不是在返回类型中 然而 我遇到了一些微不足道的情况 它不起作用 我不知道为什么 首先 这是我的主要