1

T=std::vector<T2>引数(T2は任意のタイプです)のテンプレートマッチを行いたいと思います。テンプレートの引数にboost::enable_ifを使用できます。タイプTstd::vectorであるかどうかをテストするにはどうすればよいですか?いくつかのstd :: vectorのテンプレートのみを有効にしてください<T2>タイプ

私のテンプレートにT::iteratorを含めると、非コンテナタイプが置換に失敗し、SFINAEとはみなされないようにすることができます。しかし、この方法では、std::vector<T2>だけでなく、T::iteratorを定義するコンテナは一致します。

答えて

3

おそらくenable_ifを必要としない、簡単な部分的な特殊化は十分なはずです:あなたは、関数テンプレートを扱っている場合は

template <typename T> 
struct Type { ... }; 

// partial specialization for std::vector 
template <typename T> 
struct Type< std::vector<T> > { ... }; 

が、あなたは、単にオーバーロードを提供することができます

template <typename T> 
void foo(const T & t) { ... } 

// overload for std::vector 
template <typename T> 
void foo(const std::vector<T> & vec) { ... } 
+0

+1それはたくさんの意味があります。私はその質問を誤解していたと思う。私はT2が固定型だと思った。 – sellibitze

+0

ありがとう、私はstd :: vectorのオーバーロードが優先されるかどうかはわかりませんでした。 – eudoxos

1

なぜテンプレートを使用したいのですか?単純な関数を書くことはできませんか?

とにかく、それが可能だ:

template<class T 
    ,class=typename std::enable_if<(
    std::is_same<T,std::vector<int>>::value 
)>::type 
> 
void foo(T const& vec) 

(これはC++ 11である:関数テンプレートのデフォルトテンプレート引数+ type_traits + >>シフト演算子でない)

編集:私はちょうど実現あなたの質問のT2はおそらくいくつかの固定型ではなく、多くの種類のベクトルを許可するプレースホルダです。その場合、Lucの答えを受け入れることをお勧めします。

VieleGrüßenachÖsterreich!

template <class T> 
struct is_std_vector { static const bool value=false; }; 

template <class T> 
struct is_std_vector<std::vector<T> > { static const bool value=true;} 

enable_ifと一緒に使用します。これについて:-)

+0

を - - ダンケ、lg - – eudoxos

関連する問題