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++编译器本身无法弄清楚它是指一个类型名称(而不是,比方说,静态方法或变量)在此上下文中.