包含任意类型的任意STL容器的函数模板

时间:2010-05-18 18:43:46

标签: c++ templates stl generic-programming

我有一个任意的STL容器C,它包含任意类型T的元素。我想创建一个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*/
} 

2 个答案:

答案 0 :(得分:11)

vectorset等STL结构应包含value_type类型的T类型。

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());
  ...
}

答案 1 :(得分: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中需要typedef,因为value_type是所谓的依赖类型,即它取决于a的性质模板参数和C ++编译器本身无法弄清楚它是指在此上下文中的类型名称(而不是静态方法或变量)。