#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <complex>
#include <type_traits>
using namespace std;
template < class T>
struct is_seq : std:: false_type {
} ;
template < class T>
struct is_seq< std:: vector < T>> : std:: true_type {
} ;
template < class T>
struct is_seq< std:: basic_string < T>> : std:: true_type {
} ;
template < class T>
struct is_seq< std:: list < T>> : std:: true_type {
} ;
template < class T>
using enable_if_seq_type = typename std:: enable_if < is_seq< T> :: value > :: type ;
template < class T>
using enable_if_integral_type = typename std:: enable_if < std:: is_integral < T> :: value > :: type ;
template < class T, class Enable = void >
class Compare;
template < class T>
class Compare< T, enable_if_seq_type< T>> {
public :
void foo( ) {
cout << "vector, string and list specialization" << endl;
}
} ;
template < class T>
class Compare< T, enable_if_integral_type< T>> {
public :
void foo( ) {
cout << "integral specialization" << endl;
}
} ;
int main( ) {
cout << std:: boolalpha ;
cout << is_seq< int > :: value << endl;
cout << is_seq< std:: vector < int >> :: value << endl;
Compare< int > c1;
c1.foo ( ) ;
Compare< std:: vector < int >> c2;
c2.foo ( ) ;
Compare< std:: complex < int >> c3;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGNvbXBsZXg+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgaXNfc2VxIDogc3RkOjpmYWxzZV90eXBlIHsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgaXNfc2VxPHN0ZDo6dmVjdG9yPFQ+PiA6IHN0ZDo6dHJ1ZV90eXBlIHsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgaXNfc2VxPHN0ZDo6YmFzaWNfc3RyaW5nPFQ+PiA6IHN0ZDo6dHJ1ZV90eXBlIHsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgaXNfc2VxPHN0ZDo6bGlzdDxUPj4gOiBzdGQ6OnRydWVfdHlwZSB7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdXNpbmcgZW5hYmxlX2lmX3NlcV90eXBlID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfc2VxPFQ+Ojp2YWx1ZT46OnR5cGU7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdXNpbmcgZW5hYmxlX2lmX2ludGVncmFsX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT46OnR5cGU7CgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEVuYWJsZSA9IHZvaWQ+CmNsYXNzIENvbXBhcmU7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQ29tcGFyZTxULCBlbmFibGVfaWZfc2VxX3R5cGU8VD4+IHsKCXB1YmxpYzoKCQl2b2lkIGZvbygpIHsKCQkJY291dCA8PCAidmVjdG9yLCBzdHJpbmcgYW5kIGxpc3Qgc3BlY2lhbGl6YXRpb24iIDw8IGVuZGw7CgkJfQp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIENvbXBhcmU8VCwgZW5hYmxlX2lmX2ludGVncmFsX3R5cGU8VD4+IHsKCXB1YmxpYzoKCQl2b2lkIGZvbygpIHsKCQkJY291dCA8PCAiaW50ZWdyYWwgc3BlY2lhbGl6YXRpb24iIDw8IGVuZGw7CgkJfQp9OwoKCmludCBtYWluKCkgewoJY291dCA8PCBzdGQ6OmJvb2xhbHBoYTsKCQoJY291dCA8PCBpc19zZXE8aW50Pjo6dmFsdWUgPDwgZW5kbDsKCWNvdXQgPDwgaXNfc2VxPHN0ZDo6dmVjdG9yPGludD4+Ojp2YWx1ZSA8PCBlbmRsOwoJCglDb21wYXJlPGludD4gYzE7CgljMS5mb28oKTsKCQoJQ29tcGFyZTxzdGQ6OnZlY3RvcjxpbnQ+PiBjMjsKCWMyLmZvbygpOwoJCglDb21wYXJlPHN0ZDo6Y29tcGxleDxpbnQ+PiBjMzsKCQoJcmV0dXJuIDA7Cn0=