簡體   English   中英

模板成員函數的外聯sfinae可能嗎?

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

演示

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無法封裝為實現細節。

演示

實現此目的的一種方法是內部標記分派:

#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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM