假设我有一个模板:
template<typename T>
struct Outer {
template<typename T1>
struct Inner {
};
};
我想要一个别名模板Alias
:
template<typename T>
using Alias = Outer<T>::template Inner; // this won't work
using IntOuter = Alias<int>;
,以使IntOuter<double>
与Outer<int>::template Inner<double>
相同。您如何定义Alias
?还是有可能?
编辑:
我希望能够即时创建SomeOuter
,以便为模板foo:
template<template<typename> class>
struct Foo {
};
Foo<Alias<int>>
与Foo<Outer<int>::template Inner>
或执行以下操作:
template<typename T>
using SomeFoo = Foo<Alias<T>>;
答案 0 :(得分:4)
您可以
template<typename T, typename T1>
using Alias = typename Outer<T>::template Inner<T1>;
template<typename T1>
using IntOuter = Alias<int, T1>;
或直接
template<typename T1>
using IntOuter = Outer<int>::Inner<T1>;
然后IntOuter<double>
,您将获得Outer<int>::Inner<double>
。
答案 1 :(得分:1)
你不能做你要问的事情。
这就是您问题的答案。您问一个没有足够背景知识的狭background问题,这是我能做的最好的事情。
如果您想使用C ++进行认真的元编程,则可以将模板传输为类型或值。有关一种方法,请参见boost 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> ) ) )
。
这可能不是您想要的。