1

テンプレートをT=std::vector<T2>引数のみに一致させます(T2任意のタイプです)。boost::enable_ifテンプレート引数で使用できます。Tタイプが?であるかどうかをテストするにはどうすればよいstd::vectorですか?

T::iteratorコンテナ以外のタイプが置換の失敗につながり、考慮されないように、テンプレートに含めることができます(SFINAE)。ただし、この方法では、を定義するすべてのコンテナT::iteratorが一致するだけでなく、一致しますstd::vector<T2>

4

3 に答える 3

3

これはどう:

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 と一緒に使用してください!

于 2012-02-22T10:20:40.723 に答える
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 ) { ... }
于 2012-02-22T10:20:50.813 に答える
2

なぜそのためのテンプレートを使用したいのですか?単純な関数を書けませんか?

とにかく、それは可能です:

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!:-)

于 2012-02-22T10:19:05.680 に答える