2015-09-12 5 views
8

少し前に、パラメータがゼロのテンプレートを作成できることを知りました。それは、それらを直接作成することはできませんが、あなたはメンバーテンプレートテンプレートパラメータがゼロのテンプレートで何ができますか?

私はこれが整形式であることを意図しているかどうか、あなたがこれらの獣で何ができるか疑問に思う
template<typename ...T> 
struct Maker { 
    template<T...> 
    struct HasNParams { }; 
}; 

Maker<>::HasNParams<> hnp; 

を使用することができます。それらをテンプレート引数として渡して、明示的な特殊化を作成できますか?(空の場合のみです)

+2

「SomeClassTemplate <>」で何ができるのですか?それはかなり広いと私を襲う。 – Barry

+1

一般的ですか?空の 'vector'で何ができますか? – Jarod42

+0

@Barryあなたはpre-C++ 11を作成することができませんでした。アプリケーションや記事を見たことがありません。これは、あなたがあなたのコードで使用すべきではない事故であるかどうか疑問に思いますか?あるいは、用途があり、それは何ですか? –

答えて

4

明らかな、再帰的なインスタンス生成の終了を検出する危険性があります。ここ

template<typename Arg, typename ...T> 
struct Maker : public Maker<T...> 
{ 
    template<T...> 
    struct HasNmin1Params { }; 
}; 

ポイントはMakerに実引数リストが空ではないということですが、我々は唯一のHasNminOneParamsにN-1引数を使用します。

+1

ありがとうございましたか?私はまだこれを見ていない。 –

1

は、以下のクラステンプレートを考えてみましょう:

template <typename... > struct typelist { }; 

これは、コンテナのメタプログラミングと同等です。そして、空のvectorまたはmapを持つことが有用であるのと同じように、空のtypelistを持つと便利です。つまり、タイプがtypelist<>のものです。このような構造の2つの使用例がここにあります。

これは型再帰の終了条件とすることができる:

void foo(typelist<>) { } 

template <typename T, typename... Ts> 
void foo(typelist<T, Ts...>) { 
    bar<T>(); 
    foo(typelist<Ts...>{}); 
} 

これは故障状態を示し、メタ関数のための「戻る」の値とすることができます。

我々はtypelistにフィルタメタ関数を書くために使用することができヘルパーです
template <typename F, typename T> 
struct filter_one 
: std::conditional_t<F::template apply<T>::value, 
        typelist<T>, 
        typelist<>> 
{ }; 

template <typename F, typename TL> 
struct filter; 

template <typename F, typename... Ts> 
struct filter<F, typelist<Ts...>> 
: concat_t<filter_one<F, Ts>...> 
{ }; 

はそれらの両方がtypelist<>の非常に便利な機能であり、それはちょうど1クラステンプレートです。

+0

ええ、あなたが持っているのは、空のパラメータパックを持つテンプレートのインスタンスです。私の例では、パラメータパックのないテンプレートがありますが、 'template <> struct Foo {}'のように構文が(明示的な特殊化のために予約されているので)構文ではなく単にゼロパラメータです。あなたの事例を私のケースにどのように移すことができないのか分かりません。 –

+0

@ JohannesSchaub-litbあなたの例には2つのパラメータパックがあります。 'T'は型のパックであり、' T'の無名のパックです。まだ空のパラメータパックのインスタンス化です。タイプのない空のバリューパックについて具体的に質問していますか? – Barry

+0

なぜ2番目の名前は 'T'の無名パックですか?それは私には意味がありません、あなたはそれをさらに説明できますか?私にとっては、パラメータリストに 'T 'を展開するだけで、私の場合は0パラメータになります。 –

関連する問題