使用以下元函数front
来获取第一种类型的类型列表,我尝试编写一个类似的元函数来提取模板列表的第一个模板。
namescpace detail {
template<typename L> struct front_impl;
template<template<typename, typename...> typename L, typename F, typename... I>
struct front_impl<L<F, I...>> {
typedef F type;
};
}
template<typename L> struct front_impl;
template<template<typename, typename...> typename L, typename F, typename... I>
struct front_impl<L<F, I...>> {
typedef F type;
};
可以使用如下:
template<typename... T>
struct List {
inline static constexpr size_t size = sizeof...(T);
};
using l1 = List<A, B, C>;
using f1 = front<l1>;
现在我尝试对模板列表做同样的事情。因此,我使用了一系列模板TList
:
template<template<typename> typename... TT>
struct TList {
inline static constexpr size_t size = sizeof...(TT);
};
和元函数tfront
:
template<typename T> struct tfront;
template<template<typename> typename F, template<typename> typename... R>
struct tfront<TList<F, R...>> {
template<typename T> using type = F<T>;
};
然后我可以提取模板列表中的第一个A
,B
,...(此处未显示):
using tlist = TList<A, B, C>;
template<typename T>
using f = typename tfront<tlist>::template type<T>;
f<int> xx;
然后xx
类型为A<int>
。
问题是:我可以像tfront
一样编写元函数front
,这不是模板列表的部分特化{{1对于模板的每个可变参数模板,但?所以我想为TList
引入一个参数L
作为带有可变参数模板列表的template-template-parameter,这样编译器也必须推导出tfront
类型的类型与L
的情况一样。
我想写一些像(但是用什么作为???):
front
答案 0 :(得分:3)
您需要额外的template<typename> typename...
层
template<typename>
struct tfront;
template<template<typename> typename F,
template<template<typename> typename...> typename TL,
template<typename> typename... R>
struct tfront<TL<F, R...>>
{
};