Шаблонная функция C ++, которая получает std :: vector в качестве аргумента - PullRequest
5 голосов
/ 30 августа 2011

Мне нужно сделать шаблонную функцию, которая получает в качестве параметра std :: container некоторого типа - скажем, std :: vector и удаляет все элементы из этого контейнера. Мне нужна функция, эквивалентная этой:

for_each(some_vector.begin(), some_vector.end(), [](some_vector_type* element){delete element;}); 

Звонок должен быть примерно таким:

delete_all_elements(some_vector);

Возможно ли это?

РЕДАКТИРОВАТЬ: я хочу использовать первый код внутри delete_all_elements

Ответы [ 4 ]

13 голосов
/ 30 августа 2011

Почему бы и нет?

template <typename C>
void delete_all_elements(C& container) {
    std::for_each(
        container.begin(), container.end(),
        [](typename C::value_type ptr) { delete ptr; }
    );
    container.clear();
}

Вы можете добавить, например, static_assert(std::is_pointer<typename C::value_type>::value, "Elements must be pointers"); в начале, чтобы убедиться, что вы не будете пытаться удалять не указатели.

1 голос
/ 30 августа 2011

Канонический путь:

template <typename I>
void delete_all_elements(I begin, I end)
{
    for (; begin != end; ++begin) delete *begin;
}
1 голос
/ 30 августа 2011

Почему бы не сделать что-то вроде практически каждого алгоритма STL:

template<typename Iterator>
void delete_all_elements(Iterator begin, Iterator end) {
    while (begin != end) {
        delete *begin;
        ++begin;
    }
}
0 голосов
/ 30 августа 2011

Вы ищете это (решение C ++ 03):

template<typename Container>
void delete_all(const Container & c)
{
   typename Container::const_iterator begin = c.begin(), end = c.end();
   while ( begin != end ) { delete *begin; ++begin; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...