5

enable_if が機能するコードがあり、いくつかの素晴らしいことを実行できますが、以下に示す 2 つのメソッドが同じメソッド シグネチャを持っているため、エラーが発生すると思いました。

これが許可されている理由を知っている人はいますか?

#include <iostream>
#include <boost/type_traits>


template<bool T, class R = void>
struct enable_if{
   typedef R type;
};

template<class R>
struct enable_if<false, R>{

};

template<class T>
typename enable_if<boost::is_pod<T>::value >::type  print(const T& item){
   std::cout << "T is a pod with the value: " << item << std::endl;
}

template<class T>
typename enable_if<!(boost::is_pod<T>::value) >::type  print(const T& item){
   std::cout << "T is not a pod with the value: " << item << std::endl;
}

int main(int argc, const char * argv[])
{

   print(1);

   return 0;
}
4

3 に答える 3

5

以下に示す2つのメソッドは、同じメソッドシグネチャを持っています

よく見てください:

… enable_if< boost …

vs

… enable_if< ! boost …

それらは同じではなく、反対です。一方が無効になっている場合、もう一方は有効になっています。これにより、発信者には常に1つだけが表示されます。enable_if(条件がfalseの場合、宣言を完全に非表示にすることを忘れないでください。)

于 2012-04-24T13:56:44.220 に答える
0

2 つのテンプレート関数、オーバーロードの解決に関する限り、同じシグネチャを持っています。要求された型に対して両方がインスタンス化された場合、エラーが発生します。

ただし、enable_if 一方が成功し、他方が失敗した場合、置換の失敗によりコンパイル エラーが発生するのではなく、エラーは発生せず(SFINAE: "Substitution Failure Is Not An Error")、コンパイラは単純にそれらの 1 つを次のように無視します。存在しなかった場合

したがって、2 つのテンプレートのうち 1 つのみが特定の型に対してインスタンス化され、オーバーロード解決エラーは発生しません。

于 2012-04-24T16:35:40.623 に答える
-1

2 つのメソッドは、enable_if のテンプレートの特殊化など、戻り値の型が異なります。

于 2012-04-24T13:53:34.600 に答える