SFINAE 在非类型模板中不起作用 class

SFINAE does not work in a non-type template class

我想使用 SFINAE select 特定函数编译到模板中 class 非类型 争论,我是这样做的:

#include<iostream>
#include<type_traits>
template <bool T>
struct is_right
{
    template <class Q = std::bool_constant<T>>
    typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
    {
        return true;
    }

    template <class Q = std::bool_constant<!T>>
    typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
    {
        return false;
    }
};

int main() {
    is_right<false> is_fs;
    is_right<true> is_ri;
    if(!is_fs.check() && is_ri.check()){
        std::cout << "It is right!" << std::endl;
    }
    return 0;
}

我使用 c++17 标准用 g++ 8.1.0 编译它。 但是编译器给我一个错误,说“没有匹配函数来调用 'is_right::check()'”。

但是,如果我只是用类型参数替换非类型模板参数,它会起作用:

#include<iostream>
#include<type_traits>
template <class T>
struct is_right
{
    template <class Q = T>
    typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
    {
        return true;
    }

    template <class Q = T>
    typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
    {
        return false;
    }
};

int main() {
    is_right<std::bool_constant<false>> is_fs;
    is_right<std::bool_constant<true>> is_ri;
    if(!is_fs.check() && is_ri.check()){
        std::cout << "It is right!" << std::endl;
    }
    return 0;
}

它们有本质区别吗?

第二个check函数的默认模板参数错误,应该是std::bool_constant<T>而不是std::bool_constant<!T>

调用 is_fs.check() 没有匹配函数,因为您在第一次重载中测试 is_same<bool_constant<false>, bool_constant<true>>,在第二次重载中测试 is_same<bool_constant<true>, bool_constant<false>>


另请注意,现在调用 is_ri.check() 是不明确的,因为两个 check 函数在 is_right<true>.

中均有效