2015-12-19 11 views
6

だから、関数の引数としてのstd :: enable_if:SFINAEは:、私はこのウェブページ上のどこかのコードによって設定された例以下のよ

template<typename T> 
void fun(const typename std::enable_if_t<std::is_integral<T>::value, T>& val) { 
    std::cout << "fun<int>"; 
} 

template<typename T> 
void fun(const typename std::enable_if_t<std::is_floating_point<T>::value, T>& val) { 
    std::cout << "fun<float>"; 
} 

int main() 
{ 
    fun(4); 
    fun(4.4); 
} 

この方法は:ここでは http://eli.thegreenplace.net/2014/sfinae-and-enable_if/

は、私が持っているものです私は書く必要があります:

fun<int>(4); 
fun<double>(4.4); 

どうしたらいいですか?

コンパイラは、パラメータTを推論できないと訴えます。

答えて

5

non-deduced contextにあるであるため、例が間違っています。 fun<int>(4);のような関数を呼び出さない限り、コードはコンパイルされませんが、これはおそらく著者が意図したものではありません。

正しい使用法は、コンパイラによってTが推測され、SFINAE条件が他の場所に配置されるようにすることです。戻り値の型の構文で:

template <typename T> 
auto fun(const T& val) 
    -> typename std::enable_if<std::is_integral<T>::value>::type 
{ 
    std::cout << "fun<int>"; 
} 

template <typename T> 
auto fun(const T& val) 
    -> typename std::enable_if<std::is_floating_point<T>::value>::type 
{ 
    std::cout << "fun<float>"; 
} 

DEMO

また、あなたのコード内typename sがstd::enable_if_tの使用状況と矛盾します。

使用するか(C++ 11):

typename std::enable_if<...>::type 

または(C++ 14):

std::enable_if_t<...> 

どうでしょうdoesnのコンストラクタでその仕事しかし、戻り値の型はありますか?コンストラクタの場合

、SFINAE条件は、テンプレートのパラメータリストで非表示にすることができます。

struct A 
{  
    template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0> 
    A(const T& val) 
    { 
     std::cout << "A<int>"; 
    } 

    template <typename T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0> 
    A(const T& val) 
    { 
     std::cout << "A<float>"; 
    } 
}; 

DEMO 2

+0

です。しかし、それは戻り値の型を持たないコンストラクタでどのように動作しますか? – DeiDei

+0

@DeiDei更新を参照してください –

+0

'std :: enable_if'の第2引数として' int'を使うことの意義は何ですか?それは恣意的ですか?または、 'int = 0'が安全であるからでしょうか? – Jacob

1

控除を許可するには、あなたは素直にTに基づいて関数パラメータを必要とします。 enable_ifを置く場所を特定する必要があります(実際にはTを推測することはできません)。一般的なオプションは、戻り値の型または無視するデフォルトの追加パラメータにあります。

ここにいくつかの良い例があります。http://en.cppreference.com/w/cpp/types/enable_if

関連する問題