4

std::enable_if の 2 番目のパラメーターについて混乱しています。int の戻り値の型を使用する場合、次を使用して作成できます。

template <class T>
typename std::enable_if<mpi::is_builtin<T>::value, int>::type
foo() { return 1; }

しかし、パラメーターまたはテンプレートで enable_if を使用するにはどうすればよいですか? この場合、以下の関数の違いは何ですか:

template<class T , 
       class = typename std::enable_if<std::is_integral<T>::value>::type >
T too(T t) { std::cout << "here" << std::endl; return t; }

int too(int t) { std::cout << "there" << std::endl; return t; }

ありがとう。

4

2 に答える 2

3

つまり、

template<class T , 
   class = typename std::enable_if<std::is_integral<T>::value>::type >

あれは。。。になる

template<class T , 
   class = void >

条件std::is_integral<T>::valueがの場合true、その関数は型に対して許可されているためT、オーバーロードの解決に参加します。

条件が満たされない場合、それは不正になりtypename std::enable_if<...>::type、 type の関数が無効になりますT。あなたの例では、最初のメソッドはすべての整数型 ( intunsignedlong、...) を許可しますが、クラスなどは許可しません。

例の 2 番目のみのintバージョンでは、一部の情報が失われ、値が符号なしから符号付きに変換されるか、一部の値が縮小されます。これが、場合によっては最初のバージョンが非常に役立つ理由です。

void実際には の 2 番目のパラメーターのデフォルトであることに注意してくださいstd::enable_if。これは、特定のタイプが実際には必要ないため、テンプレートなどを有効または無効にするのに十分な場合が多いです。知る/検出する必要があるのは、それが有効 ( void) であるか無効であるかだけです。無効な場合、その部分の有効な代替はありません::type

于 2013-09-24T09:40:39.073 に答える
0

以下のあまりにも機能の違いは何ですか:

1 つは任意の CopyConstructible 型に対して呼び出すことができるテンプレートでenable_if、既定のテンプレート引数が使用されている場合にのみ制約します。

#include <iostream>

template<class T , 
       class = typename std::enable_if<std::is_integral<T>::value>::type >
T too(T t) { std::cout << "here" << std::endl; return t; }

int too(int t) { std::cout << "there" << std::endl; return t; }

int main()
{
    too<double, void>(1.0);
}
于 2013-09-24T15:28:35.190 に答える