У меня есть произвольный контейнер STL C, который содержит элементы произвольного типа T. Я хочу создать станд.:: вектор, который имеет копию всех элементов. Что самый чистый путь состоит в том, чтобы сделать это?
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*/
}
Для контейнеров Кенни дал правильное решение. Однако многие функции в 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
является так называемым зависимым типом, т.е. он зависит от природы аргумента шаблона, и компилятор C ++ не может самостоятельно определить, что он ссылается на имя типа (а не, скажем, статический метод или переменная) в этом контексте.
Структуры 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());
...
}