首页 > 解决方案 > 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)上编译?

标签: c++c++11enable-if

解决方案


根据@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");
}

推荐阅读