#include <iostream>
#include <type_traits>
using namespace std;

template<typename...Ts>
struct are_same;

template<typename T, typename U, typename...Ts>
struct are_same<T, U, Ts...>
{
	static const int value = is_same<T, U>::value && are_same<U, Ts...>::value;
};

template<typename T>
struct are_same<T>
{
	static const int value = 1;
};

int main() 
{
	cout << are_same<int, int, int, int>::value << endl;
	cout << are_same<int, double, int, int>::value << endl;
	
	conditional<are_same<int, int, double>::value, int, double>::type a;
	
	return 0;
}