#include <iostream>
template<typename Lhs, typename Rhs>
struct Match
{
	static const bool Value = false;
};
template<typename T>
struct Match<T, T>
{
	static const bool Value = true;
};
template<typename T>
struct IsUS
{
	static const bool Value = Match<T, unsigned short int>::Value;
};
template<typename T>
struct IsUL
{
	static const bool Value = Match<T, unsigned long int>::Value;
};
template<typename T>
struct IsSS
{
	static const bool Value = Match<T, signed short int>::Value;
};
template<typename T>
struct IsSL
{
	static const bool Value = Match<T, signed long int>::Value;
};
template<typename T>
struct IsInt
{
	static const bool Value = IsUS<T>::Value || IsUL<T>::Value || IsSS<T>::Value || IsSL<T>::Value;
};
int main()
{
	std::cout << std::boolalpha;
	std::cout << IsInt<int>::Value;
}