2017-02-19 4 views
0

パック拡張なしのテンプレートパラメータとして可変長引数テンプレート:この方法は、鋳型を指定するための標準に従っているかどうかを私は次のコードはコンパイルされ、VS 2015で正常に実行されることがわかっ

template<typename T, template <typename ...> class Container > 
struct Holder 
{ 
    Container<T> container_; 
}; 

int main() 
{ 
    Holder<int, std::vector> h; 
    h.container_.push_back(10); 
    std::cout << h.container_.at(0); 
} 

はあなたが私に教えてもらえます上記の例では、パラメータの型を指定せずにテンプレートパラメータ(コンテナ要素の型とアロケータの型)を指定しますか? standard(ワーキングドラフトによると

+0

はそれが何を意味するの_whetherこの方法は、以下の標準_?それは許されている、それだけです。標準テンプレートライブラリがどこかで同様のことをしているかどうか知りたいですか?質問はかなり不明です。 – skypjack

+0

ありがとう、私はそれがバリデーシュテンプレートを使用することが許されているかどうかを知りたがります(またはそれはMS C++の非スタダード機能の一部です)。 –

+1

'Container'には非型テンプレートパラメータがない限り動作し、標準に準拠しています(私はこれをGCCとClangで数年間使用しています)。一部のコンパイラの古いバージョンだけが失敗しますが、これはこれらのコンパイラのバグです。 –

答えて

1
私は(それはいくつかのMS C++非stadard機能ですか)道可変長引数テンプレートを使用することはできますかどうかを知りたい

が、同じことがCに適用されます++ 11/C++ 14)、それは完全に有効なコードです。規格は、次のような使用のいくつかの例が含まれています

template <class T> struct eval; 

template <template <class, class...> class TT, class T1, class... Rest> 
struct eval<TT<T1, Rest...>> { }; 

標準テンプレートライブラリで定義されたもののいくつかは、ほとんどすべてつ以上の引数(たとえを受け入れるためにあなたは、コンテナのパラメータ・パックが必要ですこれらのパラメータのうちデフォルト値があります)。

template<class T, class Allocator = std::allocator<T>> class vector; 

は、したがって、以下が一致されていません:例として
は、あなたのコード内で使用された容器は、として宣言されている

template<typename T, template <typename> class Container> struct Holder; 
関連する問題