我有一个模板函数,其中枚举类型转换为它的底层类型,工作正常,但我写了一个重载,它应该接受一个整数并返回它自己,它给我一个错误,指出 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;
}
最佳答案
std::underlying_type<TT>::type
正在评估 std::enable_if
尽管std::is_enum<TT>::value
是false
作为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/