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;
}
4

1 に答える 1

8

2 つのステップがあります。

  1. プライマリ クラス テンプレートに一致します: enable_if<true, int>matches enable_if<bool, T>。プライマリにデフォルトの引数がある場合は、この時点でそれらを設定します。
  2. 一致するプライマリ クラス テンプレートのすべての特殊化を列挙します
    enable_if<bool, T>bool=trueT=int
    b。enable_if<true, T>、 とT=int

    部分順序付けと呼ばれるプロセスを通じて、最も特化した専門化を選択します。この場合、(2b) のインスタンス化はすべて (2a) と一致する可能性がありますが、逆は一致しない可能性があるため、(2b) は (2a) よりも具体的であるため、それを選択します。

したがって、 でインスタンス化さenable_if<true, T>T=intます。

于 2016-08-17T21:05:32.923 に答える