【问题标题】:c++ std::enable_if constraint variants and problemsc++ std::enable_if 约束变体和问题
【发布时间】:2016-12-19 05:53:58
【问题描述】:

给定一个我想返回enum class 的基础类型的函数的简短问题:

为什么这个版本可以正常工作

template<typename T>
constexpr inline
typename std::enable_if_t<
  std::is_enum<T>::value,
  typename std::underlying_type_t<T>
>
enumValue(T p_rVal) noexcept
{
  return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}

if (enumValue(myEnumClass) == 0) {}

而这个失败并出现“找不到匹配的重载函数”(VS 2015)错误:

template<
  typename T,
  typename std::enable_if_t<
    std::is_enum<T>::value,
    typename std::underlying_type_t<T>
  >
>
constexpr inline
typename std::underlying_type_t<T>
enumValue(T p_rVal) noexcept
{
  return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}

非常感谢您的帮助!

【问题讨论】:

  • @Dan 你为什么拒绝 Torbjörn 提议的编辑?改进这篇文章的格式非常有意义。
  • std::underlying_type_t&lt;T&gt;之前不需要typename
  • 是的,没错,C++14 的优势。顺便说一句,我已经删除了它们,但仍然感谢您的提示!

标签: c++ class enums c++14 enable-if


【解决方案1】:

在您的第一个示例中,只有一个template 参数T,它在函数调用enumValue(myEnumClass) 中是从参数推导出来的。这是std::enable_if_t&lt;&gt;的正确用法。

在您的第二个示例中,有两个template 参数,可以再次推导出第一个参数,但不能推导出第二个参数。这是使用std::enable_if_t&lt;&gt; 的不当/错误方式。

【讨论】:

  • 啊!对,我试过,对于第二个版本,模板 > 这工作正常!感谢您(现已接受)的回答!
  • 是的,默认模板参数是这里的方式。它不会弄乱函数签名,并允许使用auto 返回类型推导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多