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