template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html
이걸 어디에 써먹으려나
higher order type, kind