删除嵌套类型中的所有包装器类型
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...>; }
如果您的模板可能有值或模板参数,您将需要更多的专业化。
是否可以编写一个元函数,给定一个类型多次出现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...>; }
如果您的模板可能有值或模板参数,您将需要更多的专业化。