Я пытаюсь добраться, простое удаляют каждый указатель в моем vector/list/... функционируют записанные с крайней прохладной функцией лямбды.
template <typename T>
void delete_clear(T const& cont)
{
for_each(T.begin(), T.end(), [](???){ ???->delete() } );
}
У меня нет подсказки, что заполнить для???. Любая справка значительно ценится!
ОБНОВЛЕНИЕ: Это - то, на что это должно быть похожим:
template <typename Container>
void delete_clear(Container &c)
{
for_each(c.begin(), c.end(), [](typename Container::value_type x){ delete x; } );
c.clear();
}
Здесь две проблемы: сам синтаксис лямбды и как получить тип значения контейнера:
Вызвать функцию mydelete()
для каждого указателя (предполагая, что вы определили функцию-член mydelete()
):
for_each(c.begin(), c.end(), [](typename T::value_type x){ x->mydelete(); } );
Удалить их с помощью оператора delete:
for_each(c.begin(), c.end(), [](typename T::value_type x){ delete x; } );
Кроме того, лямбда не обязательно является самой крутой новой функцией в C++11 для данной проблемы:
for(auto x : c) { delete x; }
Я бы отметил, что немного сомнительно брать const ссылку на контейнер и удалять все в нем, хотя язык не останавливает вас из-за того, что указатели являются указателями. Вы уверены, что это "постоянная" операция, в пределах значения и использования вашего контейнера?
Если вы пишете этот код, возможно, вам помогут Boost pointer containers, или контейнеры shared_ptr
.
Как насчет чего-то вроде:
template <typename Container>
void delete_all(const Container& c)
{
typedef typename Container::value_type Value;
std::for_each(c.begin(), c.end(), [](const Value& v){ delete v; });
}
Обратите внимание, что это не remove указатели из контейнера, поэтому вам нужно быть очень осторожным, что вы делаете с контейнером и указателями, которые он содержит, после того, как вы его вызовете.
Вас интересуют именно ламбды?
Если вы используете boost, вы можете написать:
for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>);