Шаблоны функций для произвольных контейнеров STL, содержащих произвольные типы

У меня есть произвольный контейнер 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*/
} 
5
задан Chad Brewbaker 18 May 2010 в 18:43
поделиться

2 ответа

Для контейнеров Кенни дал правильное решение. Однако многие функции в 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 ++ не может самостоятельно определить, что он ссылается на имя типа (а не, скажем, статический метод или переменная) в этом контексте.

10
ответ дан 18 December 2019 в 07:28
поделиться

Структуры 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());
  ...
}
11
ответ дан 18 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: