我有一个任意的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*/
}
答案 0 :(得分:11)
vector
和set
等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 ++编译器本身无法弄清楚它是指在此上下文中的类型名称(而不是静态方法或变量)。