c++ - "Conversion"从类型到相同类型导致错误

标签 c++ c++11 metaprogramming template-meta-programming

我有一个模板函数,其中枚举类型转换为它的底层类型,工作正常,但我写了一个重载,它应该接受一个整数并返回它自己,它给我一个错误,指出 int 不是枚举类型。在我的模板中,这应该已经被过滤掉了。怎么了?

模板代码如下:

  template <typename TT>
  static constexpr auto get_value(TT t)
    -> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
    {
      return t;
    }

  template <typename TT>
  static constexpr auto get_value(TT t)
    -> typename std::enable_if<std::is_enum<TT>::value, typename std::underlying_type<TT>::type>::type
    {
      return (typename std::underlying_type<TT>::type)t;
    }

Demo

最佳答案

std::underlying_type<TT>::type正在评估 std::enable_if尽管std::is_enum<TT>::valuefalse作为false不是错误。由于正在评估非枚举类型,因此它会导致错误。如果我们将 SFINAE 移动到模板参数中,我们可以获得所需的重载并仍然返回正确的类型。

template <typename TT, typename std::enable_if<!std::is_enum<TT>::value, TT>::type* = nullptr>
static constexpr auto get_value(TT t) -> TT
{
    return t;
}

template <typename TT, typename std::enable_if<std::is_enum<TT>::value>::type* = nullptr>
static constexpr auto get_value(TT t) -> typename std::underlying_type<TT>::type
{
    return (typename std::underlying_type<TT>::type)t;
}

你可以看到它在这个 Live Example 中工作

关于c++ - "Conversion"从类型到相同类型导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32460481/

相关文章:

c++ - 隐式移动与复制操作和遏制

perl - 如何告诉 CPAN (Perl) 使用元编程创建的包?

c++ - 如何在新进程中运行一个函数?

c++ - 如何从 torrent 文件中读取文件?

c++ - 如何检查是否有足够的可用堆内存?

c++ - C++14如何提高 "str1 + str2 + str3 + ..."的效率?

c++ - 这是 "Tag Dispatching"吗?

python - 1 个类继承 2 个不同的元类(abcmeta 和用户定义的元)

c++ - 有没有办法找出一个类是否是另一个类的直接基础?

c++ - 当 >> 字符串流时更改双引号的行为