我可以在所有 MSVC >= 2013 上安全地使用哪些 SFINAE 技巧?

     2023-02-16     213

关键词:

【中文标题】我可以在所有 MSVC >= 2013 上安全地使用哪些 SFINAE 技巧?【英文标题】:What SFINAE tricks can I safely use on all MSVC >= 2013? 【发布时间】:2016-11-08 17:55:06 【问题描述】:

在 Qt 中,我有一个绝妙的想法(咳嗽,咳嗽),开始为标准库数据类型定义 qHash(用于 QHash 的散列函数,Qt 的关联容器之一)的重载:std::basic_stringstd::shared_ptr 和类似。

这个过程可能有一个捷径:不是追逐“任何可以用作 QHash 中的键的标准库类型”并为其添加 qHash 重载,我可以自动定义 qHash,如果type 有一个 std::hash 专门化它(合理地假设我们不想做比标准库在这个过程中所做的更多的事情)。

也就是说,我可以使用表达式 SFINAE 来实现类似的东西:

template<typename T>
auto qHash(const T &t) -> decltype(std::hash<T>()(t)) 
 
    return std::hash<T>()(t); 

不幸的是,尽管 Qt 需要 C++11 编译器,但表达式 SFINAE 不允许在任何地方因为 MSVC 不完全支持它(在撰写本文时:所有 MSVC 版本,最高和包括VS15 preview 5。反正Qt必须支持到2013年)。

因此,问题是:有没有办法做同样的事情,以某种方式

    不使用表达式 SFINAE 保证适用于所有 MSVC 版本 >= 2013?

我在想通过enable_if 之类的简单的 C++98 SFINAE 构造,但其他 SO 答案(如this one)让我认为 MSVC 2013 也可能错误编译,所以结果变成再次无法接受。

【问题讨论】:

blogs.msdn.microsoft.com/vcblog/2015/12/02/… 尝试标签调度。让您的qHash 标签调度“我可以std::hash&lt;T&gt;”到使用std::hash 或不使用std::hash 的实现。对您要测试的每一件事重复此操作。 我认为您可以在std::hash::result_type 上进行 SFINAE,根据定义,std::hash 的标准提供的专业化始终是std::size_t。即使使用原始编译器也应该可以工作。 blogs.msdn.microsoft.com/vcblog/2016/06/07/… @HansPassant:那是关于 MSVC 2015,而不是 2013。他们都没有声称支持 SFINAE 表达式,所以我们不能使用它。 :( 【参考方案1】:

我认为您不需要为此使用 SFINAE 表达式,按照这些思路应该可以工作。

template<typename T>
typename std::hash<T>::result_type qHash(const T &t) 
 
     return std::hash<T>()(t); 

或者几乎任何在hash::result_type 上执行 SFINAE 的方法。不幸的是,hash::result_type 在 C++17 中已弃用,但您仍然可以在 MSVC 2013 中使用 #ifdef 此代码。

【讨论】:

哈,当然,我正在阅读 N4594 并且发现 no 提到了std::hash&lt;T&gt;::result_type... @peppe Ta-Daa,我想你已经找到答案了 :)

怎样在vs2013中安装配置boost

...oost_1_55_0.zip解压boost文件到本地目录(如G:\\boost_1_55_0),可以发现解压后的文件中有一个bootstrap.bat文件。然后以管理员身份打开cmd窗口,上述命令执行完毕后可以发现G:\\boost_1_55_0下新生成了一个bjam.exe文件在命令窗口中输入语... 查看详情

LNK2001 在 VS 2013 (MSVC 18) 上,但不在 VS 2015 (MSVC 19) 上

】LNK2001在VS2013(MSVC18)上,但不在VS2015(MSVC19)上【英文标题】:LNK2001onVS2013(MSVC18)butnotonVS2015(MSVC19)【发布时间】:2016-08-1714:10:48【问题描述】:我使用早期版本的Cocos2dx编写游戏并使用VS2013对其进行编译。请注意,我将CMake和QtCreator... 查看详情

带有 Qt 5 和 Qt Creator 的 msvc2013

】带有Qt5和QtCreator的msvc2013【英文标题】:msvc2013withQt5andQtCreator【发布时间】:2013-10-1809:54:01【问题描述】:MSVC2013一直是released。我安装了快递版。我想在QtCreator中将它与Qt5.1一起使用。我卸载了MSVC2012。现在,当我尝试编译QtCre... 查看详情

MSVC++ 2013 中的资源

】MSVC++2013中的资源【英文标题】:ResourceinMSVC++2013【发布时间】:2014-09-0119:35:36【问题描述】:我想以char*或向量或文件的形式访问我的资源。我尝试了以下内容,但我得到了空值。我不明白为什么。第一个参数是optional我从文... 查看详情

MSVC 编译器更新

...mpilerupdate【发布时间】:2013-04-0814:13:13【问题描述】:我可以将MSVC2010编译器更新到MSVC2012但仍然使用MSVC2010集成开发环境吗?如果我有像QT这样用MSVC2010编译的第三方,更新后还能用吗?谢谢【问题讨论】:"如果我有像QT这样的... 查看详情

在 Visual Studio 2013 XP 工具集上构建提升

...oolset=msvc-12.0)在XP上不起作用。XP有一个不同的工具集(您可以在VS本身中更改)。有人知道我需要使用什么工具集字符串来使用msvc-12.0为XP 查看详情

MSVC++ 2013 似乎允许对临时对象进行赋值,有效地将它们视为左值

】MSVC++2013似乎允许对临时对象进行赋值,有效地将它们视为左值【英文标题】:MSVC++2013seemstoallowassignmentstotemporaryobjects,effectivelytreatingthemaslvalues【发布时间】:2015-08-2700:08:00【问题描述】:我在MSVC++中遇到过这个“功能”,现... 查看详情

Qt 资源系统和 MSVC C1060

】Qt资源系统和MSVCC1060【英文标题】:QtResourceSystemandMSVCC1060【发布时间】:2013-08-2108:10:59【问题描述】:我在编译qrc文件时遇到了堆空间不足的问题。qrc文件列表:<RCC><qresourceprefix="/"><file>package.lpgk</file></qres... 查看详情

如何在启动时禁用 MSVC 中的自动构建?

】如何在启动时禁用MSVC中的自动构建?【英文标题】:HowtodisableautobuildinginMSVConlaunch?【发布时间】:2021-05-2912:30:08【问题描述】:每当我启动MSVC解决方案文件时,VisualStudio都会尝试构建。我的项目文件很大,构建需要时间。所... 查看详情

std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件

】std::ofstream无法在win7/64和msvc2013上使用std::ios::ate打开大文件【英文标题】:std::ofstreamfailstoopenlargefileswithstd::ios::ateonwin7/64andmsvc2013【发布时间】:2015-10-2603:26:25【问题描述】:在windows7x64上,我正在尝试修改现有的二进制文件,... 查看详情

在 MSVC C++ 中强制循环展开

...t;8;++i)//...somecode我希望在MSVC中展开此循环。在CLang中,我可以在循环之前添加#pragmaunroll。但是如何在MSVC中做同样的事情呢?我知道无论如何编译器都会为我展开这个循环,即使没有任何编 查看详情

在 msvc 上替换 vsscanf

...但不幸的是我无法静态链接,因为它会与应用程序加载的所有插件(作为 查看详情

从 MinGW 调用 MSVC DLL 函数

...于MinGW二进制文件)。但是,opencvvesrion是相同的2.42。我可以成功加载我的 查看详情

找不到有效的 MSVC 版本

...“get-deps.cmd”文件,但它无法找到有效的MSVC版本。有人可以帮忙 查看详情

不同语言的 MSVC++ 异常 0x80000003

...项目,但我们遇到了这个非常奇怪的问题。我的安装程序可以在我们这里的所有计算机上运行,​​该应用程序可以正常工作并且没有问题;但是,当我们的客户 查看详情

qt开发msvc控件终极篇

...;目标文件扩展名2.项目属性页->项目属性->链接器->所有选项->输出文件*.dll修改为*.exe文件3.项目属性页->项目属性->常规->配置类型生成文件修改为*.e 查看详情

我可以使用 <img> 显示哪些类型的图像? (2013) [重复]

】我可以使用<img>显示哪些类型的图像?(2013)[重复]【英文标题】:WhattypesofimagecanIdisplayusing<img>?(2013)[duplicate]【发布时间】:2013-06-2607:29:07【问题描述】:在HMTL中使用&lt;img&gt;标签可以显示哪些不同类型的图像?... 查看详情

在windows上安装rust环境(代码片段)

...软的msvc或者安装mingw/cygwin。如果是新手,不想那么麻烦,可以考虑按TheRustProgrammingLanguage里面说的,安装C++buildtools,如下图所示。拉到最下面: 所有下载->  VisualStudio2019工具-> VisualStudio2019生成工具安装时,选... 查看详情