あなたはクラステンプレートとこれらのような専門のカップル使用することができます。
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
が削除され、残っているものを分析します。
それは最小限、実施例以下の:あなたはそれを実行することによって見ることができるように、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, "!");
}
を。
あなたは本当に良い点を持っています。 – Lezkus