【发布时间】:2017-12-12 23:36:51
【问题描述】:
使用以下元函数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>。
问题是:我可以像front 一样编写元函数tfront,这不是模板列表的部分特化TList 但是 对于模板的每个可变参数模板?所以我想为tfront引入一个参数L作为带有可变模板列表的模板模板参数,这样编译器也必须像@的情况一样推断L类型的类型987654339@.
我想写一些类似的东西(但是用作什么???):
template<template<typename> typename F, ??? TL, template<typename> typename... R>
struct tfront<TL<F, R...>> {
template<typename T> using type = F<T>;
};
【问题讨论】:
标签: c++ variadic-templates template-meta-programming