SFINAE 没有按预期工作
SFINAE does not work as expected
我正在阅读 this article 并发现使用 SFINAE
的这段代码非常有趣:
template<typename D, typename T2, typename... Args>
struct get_value_int<D, T2, Args...> {
template<typename D2, typename T22, typename Enable = void>
struct impl
: std::integral_constant<int, get_value_int<D, Args...>::value> {};
template<typename D2, typename T22>
struct impl <D2, T22, std::enable_if_t<std::is_same<typename D2::type_id, typename T22::type_id>::value>>
: std::integral_constant<int, T22::value> {};
static constexpr const int value = impl<D, T2>::value;
};
据我了解,如果无法实例化模板 class std::enable_if_t
,则 impl
的第一个版本将是。
但是,当我尝试编写一段更简单的代码(我认为它与上面的代码几乎相同)时,它会出现编译错误。我在这里误解了什么吗?
template<typename T,typename N = void>
class A
{
};
template <typename T>
class A<T, typename enable_if<false>::type>
{
};
SFINAE 发生在直接上下文中,这里你的条件不依赖于 T
所以这是一个硬失败,你的代码应该是这样的:
template <typename T>
class A<T, typename enable_if<condition<T>::value>::type>
{
};
我正在阅读 this article 并发现使用 SFINAE
的这段代码非常有趣:
template<typename D, typename T2, typename... Args>
struct get_value_int<D, T2, Args...> {
template<typename D2, typename T22, typename Enable = void>
struct impl
: std::integral_constant<int, get_value_int<D, Args...>::value> {};
template<typename D2, typename T22>
struct impl <D2, T22, std::enable_if_t<std::is_same<typename D2::type_id, typename T22::type_id>::value>>
: std::integral_constant<int, T22::value> {};
static constexpr const int value = impl<D, T2>::value;
};
据我了解,如果无法实例化模板 class std::enable_if_t
,则 impl
的第一个版本将是。
但是,当我尝试编写一段更简单的代码(我认为它与上面的代码几乎相同)时,它会出现编译错误。我在这里误解了什么吗?
template<typename T,typename N = void>
class A
{
};
template <typename T>
class A<T, typename enable_if<false>::type>
{
};
SFINAE 发生在直接上下文中,这里你的条件不依赖于 T
所以这是一个硬失败,你的代码应该是这样的:
template <typename T>
class A<T, typename enable_if<condition<T>::value>::type>
{
};