c++ - std::enable_if 基于使用静态 constexpr 成员函数的表达式
问题描述
以下代码是合法的 C++11 吗?
#include <type_traits>
template<typename T>
typename std::enable_if<T::Data() == nullptr>::type test (T t)
{
static_assert (t.Data() == nullptr, "pData is not null");
}
template<typename T>
typename std::enable_if<T::Data() != nullptr>::type test (T t)
{
static_assert (t.Data() != nullptr, "pData is not null");
}
clang 编译它没有错误,但 MSVC 生成以下错误消息:
error C2995: 'std::enable_if<,void>::type test(T)': function template has already been defined
note: see declaration of 'test'
我应该如何重写上面的代码,让它在常见的 C++ 编译器(GCC、Clang、MSVC)上编译?
解决方案
根据@Barry,代码是合法的 C++11(它使用 GCC 和 Clang 编译)。
所以,这是MSVC 的一个错误。我在开发者社区创建了一个错误报告。
一种解决方法是使用从以下位置派生的辅助类std::integral_constant
:
template<typename T>
class IsDataNull : public std::integral_constant<bool, T::Data() == nullptr> {};
template<typename T>
typename std::enable_if<IsDataNull<T>::value>::type test (T t)
{
static_assert (t.Data() == nullptr, "pData is not null");
}
template<typename T>
typename std::enable_if<!IsDataNull<T>::value>::type test (T t)
{
static_assert (t.Data() != nullptr, "pData is not null");
}
推荐阅读
- html - 内联块 div 在活动状态下改变高度
- javascript - Java JSObject.eval() 不起作用,是否需要导入?
- html - 无法让图像响应?
- c - 如何在 C 中使用参数从文本文件中打印字符?
- javascript - 如何使用 AWS Cognito 对 API Gateway 进行身份验证
- docker - 如何将 C++ 库(例如 libjpeg-dev)添加到 Windows Docker Image 中,以便 CMake 可以检测到它们?
- amazon-web-services - 何时在 aws lambda 中使用 process.exit?
- ckan - 数据代理与数据预览
- java - Thymeleaf 在另一页上呈现一个页面错误
- android - 无法打印整个字符串值