5

任意の型 T の要素を含む任意の STL コンテナー C があります。すべての要素のコピーを持つ std::vector を作成したいと考えています。これを行う最もクリーンな方法は何ですか?

template <typename C>
void myfunction(C container){

     /*Derive the type T of elements within the container*/

     std::vector<T> mystack;

    /* Iterate over container and push_back() the elements into mystack*/
} 
4

2 に答える 2

11

のような STL 構造には、typedef された型が含まれている必要がvectorあります。setvalue_typeT

std::vector<typename C::value_type> mystack;

ところで、コンテナを自分で反復処理する必要はありません。使うだけ

template <typename C>
void myfunction(const C& container){
  std::vector<typename C::value_type> mystack(container.begin(), container.end());
  ...
}
于 2010-05-18T18:45:12.307 に答える
10

コンテナーについては、Kenny が正しい解決策を示しています。ただし、C++ の多くの関数は、コンテナーの代わりに反復子のペアを使用します。ここでも同じロジックを適用できます。イテレータはiterator_traits、関連する型に関する情報を提供するために使用します。

template <typename It>
void myfunction(It start, It end) {
    // Get value for iterator:

    typedef typename std::iterator_traits<It>::value_type T;

    // Do something, e.g. calculate the minimum:

    T min_value = *std::min_element(start, end);
}

ちなみに、はいわゆる従属型であるためtypenameに必要です。つまり、テンプレート引数の性質に依存し、C++ コンパイラはそれが型名を参照していることを独自に判断できません (たとえば、このコンテキストでは静的メソッドまたは変数)。typedefvalue_type

于 2010-05-18T18:49:56.083 に答える