层次结构中的反向可变模板参数

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>>);

以上是关于层次结构中的反向可变模板参数的主要内容,如果未能解决你的问题,请参考以下文章

Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外

C/C++中的可变参数和可变参数模板

模板方法模式

C++11 中的非类型可变参数函数模板

C++中的可变参数模板

编译器跳过 C++ 中的可变参数模板/函数 [关闭]