层次结构中的反向可变模板参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了层次结构中的反向可变模板参数相关的知识,希望对你有一定的参考价值。
我目前有使用类型列表的此类:
template<class AbstractF, template<class, class > class Creator, class TList>
class A: public B<typename Reverse<TList>::Result, Creator, AbstractF>
;
我正在尝试使代码对c ++ 11更加友好,用可变参数模板参数替换类型列表。
template<class AbstractF, template<class, class > class Creator, class TList...>
class A: public B<Creator, AbstractF, TList...> //<---how to revert here?
;
问题是:如何反转可变参数列表?在查看其他问题时,我看到了std::tuple
的用法,但是在这种情况下,我无法理解如何对其进行“解压缩”,因为可变参数不是简单模板函数的一部分,而是在类中用作参数层次结构。
答案
如果包中的所有类型都是不同的,则可以从类型本身计算类型index
。剩下的就是从包中提取第N - 1 - index
个类型:
template<std::size_t index, class... Ts>
using Nth_type = std::tuple_element_t<index, std::tuple<Ts...>>;
template<class S, class... Ts>
inline constexpr std::size_t type_index = 0;
template<class S, class T, class... Ts>
inline constexpr std::size_t type_index<S, T, Ts...> =
std::is_same_v<S, T> ? 0 : 1 + type_index<S, Ts...>;
template<class T, class... Ts>
using Reverser = Nth_type<sizeof...(Ts) - 1 - type_index<T, Ts...>, Ts...>;
简单示例:
template<class... Ts>
class B;
template<class... Ts>
using B1 = B<Reverser<Ts, Ts...>...>;
static_assert(std::is_same_v<B1<int, float, double>, B<double, float, int>>);
以上是关于层次结构中的反向可变模板参数的主要内容,如果未能解决你的问题,请参考以下文章