Я сделал небольшой пример, чтобы понять, как boost::bind ()
работает с коллекциями. У меня есть класс с именем Data:
class Data
{
public:
void print ();
const std::string& get () const;
std::string& get () ;
};
Я создал std::vector
объектов данных, называемых сэмплами, и я могу использовать bind
так же, как работает std::mem_fun_ref
.
std::for_each (samples.begin (),samples.end (),std::mem_fun_ref (&Data::print));
std::for_each (samples.begin (),samples.end (),boost::bind (&Data::print,_1));
Основная идея заключается в том, что bind
возвращает функциональный объект типа bind_t<RetType=void, ObjType=Data, ArgType=void>
. Функция-член в качестве первого параметра позволяет компилятору выводить RetType
, ObjType
и ArgType
. Заполнитель _1
соответствует объекту данных, который должен быть предоставлен алгоритмом.
Затем std::for_each
вызывает функциональный объект «для каждого» элемента следующим образом:
for ( ; first!=last; ++first ) f(*first);
bind_t::operator(ObjType& obj)
вызывается, и его определение должно быть примерно таким:
return (obj.*_method ());
Я создал класс Filter
, который выполняет некоторую обработку элемента данных.
class Filter
{
void filter (Data& data);
...
};
Если я хочу применить фильтр к элементам данных в векторе, я вызываю bind
следующим образом:
std::for_each (samples.begin (),samples.end (),boost::bind (&Filter::filter,filter,_1));
for_each
передает объект Data
в bind_t::operator()
. В этом случае объект функции уже имеет объект и просто нуждается в параметре, поэтому в этом случае заполнитель _1 ссылается на аргумент.
А вот и мой вопрос:
Как можно использовать bind
, если мне приходится перебирать std::map
, а не вектор?
(Извините за все объяснения, я просто хочу убедиться, что понимаю, как работает bind
)