您可以使用类模板,像这样一对夫妇专门化:
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;
};
类模板有助于停止迭代在你的类型的链条。
第一个专业记忆一个类模板,并帮助清理遗留物。
最后一个专业化将删除检测到的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
是从原始类型删除。
你的确有一个很好的观点。 – Lezkus