Is out-of-line sfinae on template member functions possible?

佐手、 提交于 2019-12-31 02:31:11

问题


Demo

A in class declaration of A::foo.

struct A {
    template <typename T>
    void foo(T a); 
};

A::foo is now split by sfinae.

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

This doesn't work. Is this not allowed?


回答1:


The return type in the declaration must match the definition.

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

SFINAE cannot be encapsulated as an implementation detail.

(demo)




回答2:


One way to achieve this is to internally tag-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));
}


来源:https://stackoverflow.com/questions/43818137/is-out-of-line-sfinae-on-template-member-functions-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!