2016-06-19 7 views
5

T<Us...>のようなタイプのものを上位の種類としましょう。ある種の高級タイプのSomeType(それはstd::vector<int>と言いましょう)に対して、タイプ特性を使用してTの部分(std::vector)を抽出したいと思います。だから今、私はstd::vector<Foo>を定義するためにHKT<SomeType>::type<Foo>を行うことができます上位の種類のエイリアステンプレート

template<typename> 
struct HKT; 

template<template <typename...> class T, typename... Us> 
struct HKT<T<Us...>> { 
    template<typename... Vs> 
    using type = T<Vs...>; 
}; 

:私のような何かを行うことができます。

しかし、私は::type部分を取り除こうとしています。ちょうどtypename std::enable_if<T>::typeのように、std::enable_if_t<T>と省略することができます。私の場合はHKT_t<SomeType>(それが存在すると仮定している)が型の代わりにエイリアステンプレートになるため、それが可能かどうかはわかりません。そして使用法はHKT_t<SomeType><Foo>のようなものになるでしょう...これは本当に "エイリアステンプレートテンプレート"だと思います。

これを行う理由は、テンプレートテンプレートパラメータの引数として使用することです。たとえば、

template<template <typename...> class T> 
void foo() {...} 

foo<HKT_t<std::vector<int>>>(); 

これは可能ですか?

+0

残念ながら、 'X 'はテンプレートを指定できないため、 'HKT_t > '' std :: vector'のエイリアスにすることはできません。 –

答えて

1

クリスは、あなたの最良の選択肢を述べたように、あなたのfooを呼び出すために、ラッパー関数を作成することです:

template <class T> 
void wrapper_foo() { 
    foo<T::template type>(); 
} 

//to call foo 
wrapper_foo<HKT<std::vector<int>>>(); 

またはテンプレートパラメータのデフォルト値を使用します

template<class T, template <class...> class TT = T::template type> 
void foo() { 
    TT<float> t; 
} 

今、あなたは、単に呼び出すことができます:

foo<HKT<std::vector<int>>>(); 
+0

使い方とはちょっと違います。あなたは私の更新を見てみることができますか? –

+0

@ ZizhengTaiだからあなたはそれを不特定の権利のままにしたいですか? –

+0

部分的には特殊化されていませんが、エイリアステンプレートは部分的に特殊化することはできません。 –