BugTraq.Ru
Русский BugTraq
https://bugtraq.ru/lj/archive/2006/2903.2254.html

stlное
29.03.06 22:54 // оригинал
Жутко раздражает, что в stl нет встроенного варианта очистки контейнеров с принудительным вызовом delete для каждого элемента, из-за чего вечно приходится придумывать какие-то подпорки (да, я в курсе про boost::shared_ptr, который можно использовать в контейнерах, но пока не заставил себя на него перейти).
Первый вариант моих функций ClearList и ClearMap использовал честный проход итератором по циклу, что несколько раздражало, второй был сделан через for_each и пару классов-функционалов (привет примеру из Мейерсовского Effective STL), что все равно оставляло некую неудовлетворенность громоздкостью и наличием двух классов с чуть разным интерфейсом, нужных только для удаления поступающего на вход объекта.



struct DoDelete
{
template<typename T> void operator()(const T* p) const
{
delete p;
}
};

struct DoDeleteMap
{
template<typename T1, typename T2> void operator()(const pair<T1,T2>& p) const
{
delete p.second;
}
};

template <class List> void ClearList(List& lst)
{
for_each(lst.begin(), lst.end(), DoDelete());
lst.clear();
}

template <class Map> void ClearMap(Map& map)
{
for_each(map.begin(), map.end(), DoDeleteMap());
map.clear();
}




Ну а поскольку в последнее время все чаще использую boost::bind, последний вариант сделал через нее, с чувством глубокого удовлетворения выкинув дублирование функционалов. Но, честно говоря, хоть я и охотно допускаю, что существуют люди, способные спокойно сходу писать/читать подобный код, для меня это уже совсем другой язык, мощность которого я вполне осознаю, но использование которого дается с баальшим скрипом (а это ведь еще самые верхи, без использования boost::function, boost::lambda или, упаси господь, boost::mpl).



template<class T> void DoDelete(const T& p)
{
delete p;
}

template <class List> void ClearList(List& lst)
{
for_each(lst.begin(), lst.end(), boost::bind(&::DoDelete<List::value_type>, _1));
lst.clear();
}

template <class Map> void ClearMap(Map& map)
{
for_each(map.begin(), map.end(), boost::bind(&::DoDelete<Map::mapped_type>, boost::bind(&Map::value_type::second, _1)));
map.clear();
}

 
обсудить  |  все отзывы (0)  |  обсудить в LJ [701]
назад «  » вперед

последние записи
песчаное // 13.03.24 18:05
макоудаленное // 29.01.24 23:10
разнонедельное // 07.12.23 15:09
qtменюшное // 29.09.23 23:47
неестественноинтеллектуальное // 29.09.23 16:50
основательное // 18.09.23 00:15
отпускное // 06.08.23 00:26
вчерашнезавтрашнее // 02.07.23 15:25
позитивное // 27.06.23 13:05
тейлскейлное // 18.04.23 20:43





  Copyright © 2001-2024 Dmitry Leonov Design: Vadim Derkach