C++ 具有模板化类成员函数的SFINAE

C++ 具有模板化类成员函数的SFINAE,c++,c++11,sfinae,C++,C++11,Sfinae,我试图了解SFINAE,在尝试将其应用于模板类成员函数时遇到了一个问题。感谢您,我能够设置一个基本示例: 我有两个后续问题: 1.如何区分成员函数的声明和定义? 我尝试了下面的定义: template <typename T> template <typename U = T, typename std::enable_if_t<!std::is_same<U, int>::value && !std::is_same<U, float&

我试图了解SFINAE,在尝试将其应用于模板类成员函数时遇到了一个问题。感谢您,我能够设置一个基本示例:

我有两个后续问题: 1.如何区分成员函数的声明和定义? 我尝试了下面的定义:

template <typename T>
template <typename U = T, typename std::enable_if_t<!std::is_same<U, int>::value && !std::is_same<U, float>::value,int> = 0>
    void Foo<T>::sfinae() { // Foo<anything else>
        std::cout << "sfinae default" << std::endl;
    }
但这会导致编译错误。 2.打印sfinae default的catch all default CASE当前必须写入nottype1、type2、,。。。这可能是巨大的。是否有更短/更干净的解决方案

编辑: 根据@Jans的回答,这里有一个。

在越界定义中,如果删除默认参数,它们将取自声明:

template <class T>
template <typename U, typename std::enable_if_t<!std::is_same<U, int>::value && !std::is_same<U, float>::value,int>>
void Foo<T>::sfinae() { // Foo<anything else>
    std::cout << "sfinae default" << std::endl;
}

这意味着因为。。。比任何其他参数都差,int优于…,过载sfinae。。。只有在其他两人无法通话时,即他们无法通话时,才会考虑此选项。

谢谢,我可以确认此选项是否有效!也就是说:1没有额外的int参数是不可能的吗?你能在回答中补充一些关于排名的细节吗?
template <class T>
template <typename U, typename std::enable_if_t<!std::is_same<U, int>::value && !std::is_same<U, float>::value,int>>
void Foo<T>::sfinae() { // Foo<anything else>
    std::cout << "sfinae default" << std::endl;
}
template <typename U = T>
void sfinae(...);

template <typename U = T, typename std::enable_if_t<std::is_same<U, int>::value,int> = 0>
void sfinae(int);

template <typename U = T, typename std::enable_if_t<std::is_same<U, float>::value,int> = 0>
void sfinae(int);

Foo<char>{}.sfinae(0); // select the catch-all