我有一个模板函数,其中枚举类型转换为其基础类型,但工作正常,但我写了一个重载应该采取一个整数并返回自身,它给我一个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;
}
我不知道'underlying_type'是SFINAE友好,但有一个[解决方法](http://coliru.stacked-crooked.com/a/e7f1dd3b75c8d9c2)为 –
什么?我看到它有效,但是这里发生了什么,使它起作用了?为什么SFINAE友好的'underlying_type'不会? – Adrian
“std :: underlying_type :: type”的实例化被推迟,所以'enable_if'可能首先失败。 * * SFINAE友好的*我的意思是任何替换失败都只发生在紧接着的上下文中(如果它发生在'underlying_type'本身内部,它不是SFINAE友好的)。 –