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

Cha*_*ker 5 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*/
} 
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 11

STL结构喜欢vector并且set应该包含value_typetypedef-ed 的类型T.

std::vector<typename C::value_type> mystack;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不需要自己迭代容器.只是用

template <typename C>
void myfunction(const C& container){
  std::vector<typename C::value_type> mystack(container.begin(), container.end());
  ...
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,typename是必要的typedef因为value_type是一个所谓的依赖类型,即它取决于模板参数的性质,而C++编译器本身无法弄清楚它是指一个类型名称(而不是,比方说,静态方法或变量)在此上下文中.

  • 这是对Kenny的回答的一个很好的补充,尽管如果你不想命名一个指向_one传递最后一个有效元素的迭代器,我会觉得我的向上投票要好得多,就像检索最后一个有效元素的公共容器成员函数一样.这种混淆的可能性很大. (3认同)