繁体   English   中英

级联可变参数模板模板参数

[英]Cascade variadic template template parameters

如何级联可变参数类型? IE:

template <typename... T>
using Cascade = ???; // T1<T2<T3<...>>>

例子:

using Vector2D = Cascade<std::vector, std::vector, double>;
static_assert(std::is_same_v<Vector2D, std::vector<std::vector<double>>>);

您不能拥有 CascadeRight。 T1 不是类型名,它是模板,其他大多数也是如此,但最后一个是类型名。 在同一个参数包中不能有不同的参数类型(类型和模板)。 在参数包之后你也不能有任何东西。

你可以像这样拥有 CascadeLeft:

  template <typename K, template <typename...> class ... T>
  class CascadeLeft;                  
                                      
  template <typename K>               
  class CascadeLeft<K>                
  {                                   
      using type = K;                 
  };                                  
                                      
  template <typename K, 
            template <typename...> class T0, 
            template <typename...> class... T>
  class CascadeLeft<K, T0, T...>      
  {                                   
      using type = typename CascadeLeft<T0<K>, T...>::type;
  };   

坦率地说, std::vector<std::vector<double>>CascadeLeft<double, std::vector, std::vector>透明得多,所以我不会打扰。

使用CascadeRight扩展已接受的答案并支持最内层模板的多种类型:

template<template<typename...> typename Head, template<typename...> typename... Tail>
struct CascadeRight {
    template<typename... T>
    using type = Head<typename CascadeRight<Tail...>::type<T...>>;
};

template<template<typename...> typename Head>
struct CascadeRight<Head> {
    template<typename... T>
    using type = Head<T...>;
};

template<template<typename...> typename Head, template<typename...> typename... Tail>
struct CascadeLeft {
    template<typename... T>
    using type = typename CascadeLeft<Tail...>::type<Head<T...>>;
};

template<template<typename...> typename Head>
struct CascadeLeft<Head> {
    template<typename... T>
    using type = Head<T...>;
};
using T1 = CascadeRight<std::vector, std::map>::type<int, double>;
using T2 = CascadeLeft<std::map, std::vector>::type<int, double>;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM