0

これは些細な質問かもしれませんが、私を夢中にさせています。、、、などのfoo()さまざまなコンテナーで 機能する単一の関数を定義したいと考えていvector<int>ます。vector<double>set<int>set<double>

私はこのように foo を定義しようとしました:

template<typename CONT, typename T>
   int foo(CONT<T>){
      //evaluate x
      return (int) x ;
   }

この種の定義は機能しませんが、その理由がわかりません。

どうすれば同様のことを達成できますか?

4

2 に答える 2

6

コンテナー クラス テンプレートとそのインスタンス化の両方を指定する方法は、テンプレート テンプレート パラメーターを使用することです。

template <template <typename...> class Cont, typename T>
int foo(Cont<T>) {
    ...
}

可変数の引数を使用していることに注意してくださいCont。そうしないと、標準コンテナが持つデフォルトのテンプレート引数の未知の数をカバーできないためです。

于 2012-10-18T23:11:45.323 に答える
5

このことを考慮:

template< class ContainerT >
int foo( ContainerT const& c ) {
}

次に、 、またはContainerTを含む任意のものにすることができます。したがって、新しいテンプレート パラメーターを追加する必要はありません。型を知る必要がある場合は、コンテナーを使用するだけです。std::vector<int>std::vector<std::string>std::map<std::string, int>value_type

typedef typename ContainerT::value_type container_type; // Or T in your foo
于 2012-10-18T23:10:59.140 に答える