информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100Где водятся OGRыСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Утекший код XP и Windows Server... 
 Дела виртуальные 
 Простое пробивание рабочего/провайдерского... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / блог / архив / 2006
АРХИВ
архив
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006
2005
2004
2003
2002
archive




Paragon Partition Manager 7.0

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 [406]
назад «  » вперед

последние записи
яблочноучебное // 11.09.20 18:34
яблочнопереключальное // 26.07.20 17:07
яблочноденежное // 14.07.20 23:06
яблочноотличное // 14.07.20 15:37
памятное // 18.06.20 00:59
ГПБ vs TV // 06.06.20 21:32
викиисключительное // 20.05.20 21:20
гуглемитное-2 // 14.04.20 16:01
гуглемитное // 10.04.20 12:12
микрофонное // 27.03.20 17:49


авто венгрия вырвиглаз германия глюки греция гуглемап драйверы египет железки журнализм империя добра испания италия кино кипр клоуны книги криворучки оспорт португалия программизм сайт софт стрим студень турция уродцы фото франция цацки чехия читалки android bq e51 eeepc from facebook hd2 hpc htc ipad iphone onlime vista windows 10 windows 7 windows 8 yota



Rambler's Top100
Рейтинг@Mail.ru



  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach