2017-08-15 5 views
1

特定の型の複数の出現を持つ型を指定すると、クラスDecoratorの出現なしの型を戻すメタ関数を記述できますか?ネストされた型のすべてのラッパー・タイプを削除する

の例では、我々は、最終的なタイプの構造は確かに正しい型であることを前提としてい A<T<B<A<C>>>>

にタイプ A<Decor<T<B<A<Decor<C>>>>>> 次変換するのだろうが、我々は、入力タイプの構造に何かを負いません。 。入力タイプを構成するために使用されるいくつかのタイプが、template<class...> classまたは他のタイプのクラスの形式である場合があります。

答えて

0
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...>; } 

テンプレートに値テンプレートテンプレート引数がある場合は、さらに専門化する必要があります。

+0

あなたは本当に良い点を持っています。 – Lezkus

1

あなたはクラステンプレートとこれらのような専門のカップル使用することができます。

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, "!"); 
} 

を。

+0

神様、あなたは正しいです。私はほとんどこれを実装しましたが、何かを見逃してしまいました。このタイプのマッチングはできませんでした。 私が指摘したように、クラスはテンプレート引数で可変である可能性がありますが、一般化は簡単です。どうもありがとうございます! – Lezkus

+0

@Lezkusバリデーションのコメントを逃しました。答えをまとめるのに数分を要する。 @Lezkus Done。 – skypjack

+1

コードは_variadic-oriented_です。 ;-) – skypjack

関連する問題