#include <type_traits>
template < typename T>
std:: enable_if_t < std:: is_integral < T> :: value , // test is true for T=int
void > foo( T& ) { }
template < typename T>
std:: enable_if_t < std:: is_pointer < T> :: value , // test is false for T=int
void > foo( T& ) { }
void bar( )
{
int i;
foo( i ) ; // calls foo( int& ) (obviously), compiles fine
}
template void foo( int & ) ; // explicit instantiation, throws compiler error
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0ZDo6ZW5hYmxlX2lmX3Q8IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLCAgLy8gdGVzdCBpcyB0cnVlIGZvciBUPWludAp2b2lkPiBmb28oIFQmICkge30KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdGQ6OmVuYWJsZV9pZl90PCBzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCAgLy8gdGVzdCBpcyBmYWxzZSBmb3IgVD1pbnQKdm9pZD4gZm9vKCBUJiApIHt9Cgp2b2lkIGJhciggKQp7CiAgaW50IGk7CiAgZm9vKCBpICk7ICAvLyBjYWxscyBmb28oIGludCYgKSAob2J2aW91c2x5KSwgY29tcGlsZXMgZmluZQp9CnRlbXBsYXRlIHZvaWQgZm9vKCBpbnQmICk7ICAvLyBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCB0aHJvd3MgY29tcGlsZXIgZXJyb3I=