struct TemplateTypeList0 {};

template<template<typename> class U>
struct TemplateTypeSel
{
	template<typename T>
	struct bind
	{
		typedef U<T>	type;
	};
};

template<template<typename T> class T1, template<typename T> class ...Args>
struct VariadicTemplateTypeList
{
	typedef TemplateTypeSel<T1>	Head;
	typedef VariadicTemplateTypeList<Args...>	Tail;
};
template<template<typename T> class T1>
struct VariadicTemplateTypeList<T1>
{
	typedef TemplateTypeSel<T1>	Head;
	typedef TemplateTypeList0	Tail;
};

template<template<typename T> class ...Args>
struct Templates
{
	typedef VariadicTemplateTypeList<Args...> type;
};



template<typename T>
struct Y
{
	T v;
};


int main(void)
{
	VariadicTemplateTypeList<Y, Y>::Head::bind<int>::type a;
	Templates<Y>::type::Head::bind<int>::type b;
	return 0;
}
