Вы не можете делать то, что просите.
Это ответ на ваш вопрос. Вы задаете узкий вопрос без достаточного фона, это лучшее, что я могу сделать.
Если вы хотите сделать серьезное метапрограммирование в C ++, вы можете перенести шаблоны в типы или значения. Смотрите подходящую библиотеку Hana для одного подхода.
Но никто не будет взаимодействовать с
template<template<typename> class>
struct Foo {
};
«Из коробки».
template<class T>struct tag_t{using type=T;};
template<class T>constexpr tag_t<T> tag{};
template<template<class...>class Z>struct ztemplate_t{
template<class...Ts>using apply=Z<Ts...>;
template<class...Ts>
constexpr tag_t<Z<Ts...>> operator()(tag_t<Ts>...)const{return {};}
};
template<template<class...>class Z>constexpr ztemplate_t<Z> ztemplate{};
template<class Tag>using type_t=typename Tag::type;
#define TYPE(...) type_t<decltype(__VA_ARGS__)>
Теперь
template<typename T>
constexpr auto Alias = ztemplate<Outer<T>::template Inner>;
теперь значение, которое действует как шаблон.
Отображение Foo
на:
template<template<class...>class Z>
constexpr tag_t<Foo<Z>> foo( ztemplate_t<Z> ){return {};}
позволяет вам сделать TYPE( foo(Alias( tag<int> ) ) )
.
Это, вероятно, не то, что вы хотите.