2016-08-17 4 views
2

テンプレートクラスのペアであるenable_ifの実装を理解しようとします。私が理解していないもの、なぜenable_if<true, int>が最初のものと一致しないのですか?これはどうやって決まるの?テンプレートクラスはどのように一致しますか

#include <iostream> 

template <bool, class T = void> 
struct enable_if 
{ 
    enable_if() { std::cout << "invalid type";} 
}; 

template <class T> 
struct enable_if<true, T> 
{ 
    typedef T type; 
    enable_if() { std::cout <<"valid type";} 
}; 

int main(){ 
    enable_if<0==0, int> example; // print "valid type" 
    return 0; 
} 
+0

ベストフィットなど。明示的な特殊化を選択することができる場合はそれが適用され、そうでない場合は基本テンプレートがデフォルトになります。 – DeiDei

+1

これは[部分注文](http://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering)と呼ばれています。 – Praetorian

答えて

8

2つの手順があります。

  1. プライマリクラスのテンプレート:enable_if<true, int>と一致するのはenable_if<bool, T>です。プライマリにデフォルトの引数があった場合は、ここに入力します。
  2. 一致するプライマリクラステンプレートのすべての特殊化を列挙します。
    a。 enable_if<bool, T>bool=trueおよびT=int
    b。 T=int

    enable_if<true, T>は、我々はあなたが最も具体的なものを選ぶよう非公式に考えることができます半順序と呼ばれるプロセスを通じて最も専門的な専門を選びます。この場合、すべての(2b)インスタンシエーションは(2a)とマッチすることができますが、逆ではないので、(2b)は(2a)よりも具体的です。

だから、あなたはインスタンス化T=intenable_if<true, T>で終わります。

関連する問題