在模板成员函数上是台外Sfinae



demo

a在a :: foo。

的类声明中
struct A {
    template <typename T>
    void foo(T a); 
};

a :: foo现在被sfinae分开。

template <typename T>
typename std::enable_if<(sizeof(T) > 4), void>::type A::foo(T a ) {
    std::cout << "> 4 n";
}

这不起作用。这不允许吗?

声明中的返回类型必须与定义匹配。

struct A {
    template <typename T>
    typename std::enable_if<(sizeof(T) > 4), void>::type
    foo(T a); 
};

sfinae不能被封装为实现细节。

(demo(

实现此目的的一种方法是内部标记dispatch:

#include <utility>
#include <iostream>
struct A {
    template <typename T>
    void foo(T a); 
    private:
    template<class T> 
    auto implement_foo(T value, std::true_type) -> void;
    template<class T> 
    auto implement_foo(T value, std::false_type) -> void;
};
template <typename T>
void A::foo(T a ) {
    implement_foo(a, std::integral_constant<bool, (sizeof(T)>4)>());
}
template<class T> 
auto A::implement_foo(T value, std::true_type) -> void
{
    std::cout << "> 4 n";
}
template<class T> 
auto A::implement_foo(T value, std::false_type) -> void
{
    std::cout << "not > 4 n";
}

main()
{
    A a;
    a.foo(char(1));
    a.foo(double(1));
}

最新更新