[英]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.