SFINAE无法按预期工作

时间:2016-10-12 17:55:04

标签: c++ sfinae partial-specialization

我正在阅读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;
};

据我了解,如果模板类std::enable_if_t无法实例化,impl的第一个版本就会出现。

但是,当我尝试编写一段更简单的代码时,我认为它与上面的代码几乎相同,它会出现编译错误。我在这里误解了什么吗?

 template<typename T,typename N = void>
 class A
 {

 };

 template <typename T>
 class A<T, typename enable_if<false>::type>
 {

 };

1 个答案:

答案 0 :(得分:3)

SFINAE发生在紧邻的情况下,这里你的情况并不依赖于T所以这是一个很难的失败,你的代码应该是这样的:

template <typename T>
class A<T, typename enable_if<condition<T>::value>::type>
{
};