删除嵌套类型中的所有包装器类型

Delete all wrapper types in a nested type

是否可以编写一个元函数,给定一个类型多次出现template<class> class Decor,returns没有出现class[=11=的类型].

一个例子是转换以下类型 A<Decor<T<B<A<Decor<C>>>>>> 进入 A<T<B<A<C>>>>

我们假设最终类型的结构确实是正确的类型,但我们不对输入类型的结构做任何假设。可能是某些用于构造输入类型的类型的形式为 template<class...> class 或任何其他类型 class.

您可以使用 class 模板和一些像这样的专业:

template<typename T>
struct RemDec {
    using type = T;
};

template<template<typename...> class C, typename... T>
struct RemDec<C<T...>> {
    using type = C<typename RemDec<T>::type...>;
};

template<typename T>
struct RemDec<Decorator<T>> {
    using type = typename RemDec<T>::type;
};

class 模板有助于停止迭代类型链。
第一个专业 记住 一个 class 模板并帮助清理剩下的内容。
最后一个专业删除检测到的 Decorator 并继续分析剩余的内容。


它遵循一个最小的工作示例:

#include<type_traits>

template<typename>
struct Decorator {};

template<typename...>
struct S {};

template<typename T>
struct RemDec {
    using type = T;
};

template<template<typename...> class C, typename... T>
struct RemDec<C<T...>> {
    using type = C<typename RemDec<T>::type...>;
};

template<typename T>
struct RemDec<Decorator<T>> {
    using type = typename RemDec<T>::type;
};

int main() {
    static_assert(std::is_same<
        typename RemDec<S<Decorator<S<S<Decorator<S<int>>>>>, Decorator<S<double>>>>::type,
        S<S<S<S<int>>>, S<double>>
    >::value, "!");
}

正如您在 运行 中看到的那样,Decorator 的任何 实例 都已从原始类型中删除。

 template <class T>
 struct RemDec
 { using type = T; };
 template <class T>
 struct RemDec<Decor<T>>
 { using type = T; };
 template <class T>
 struct RemDec<T&>
 { using type = typename RemDec<T>::type&; };
 template <class T>
 struct RemDec<T&&>
 { using type = typename RemDec<T>::type&&; };
 template <class T>
 struct RemDec<const T>
 { using type = typename RemDec<T>::type const; };
 template <class T>
 struct RemDec<volatile T>
 { using type = typename RemDec<T>::type volatile; };
 template <template <typename...> class TT, class... Ts>
 struct RemDec<TT<Ts...>>
 { using type = TT<typename RemDec<Ts>::type...>; }

如果您的模板可能有值或模板参数,您将需要更多的专业化。