Reputation: 7513
I try to understand the enable_if
implementation, which is a pair of template classes. what I do not understand, why enable_if<true, int>
is not matched to the first one? how is this decided?
#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;
}
Upvotes: 2
Views: 63
Reputation: 303427
There are two steps.
enable_if<true, int>
matches enable_if<bool, T>
. If there were any default arguments on the primary, we'd populate them at this point. We enumerate all the specializations of the primary class template that also match, which would be:
a. enable_if<bool, T>
, with bool=true
and T=int
b. enable_if<true, T>
, with T=int
We pick the most specialized specialization through a process called partial ordering, which you can think of informally as picking the most specific one. In this case, (2b) is more specific than (2a) because all (2b) instantiations could match against (2a) but not the reverse, so we select that one.
And so, you end up with an instantiation enable_if<true, T>
with T=int
.
Upvotes: 8