【发布时间】:2012-02-26 13:15:42
【问题描述】:
我做了一个小例子来了解boost::bind () 是如何处理集合的。我有一个名为 Data 的类:
class Data
{
public:
void print ();
const std::string& get () const;
std::string& get () ;
};
我创建了一个名为 samples 的数据对象 std::vector,并且我能够以与 std::mem_fun_ref 相同的方式使用 bind。
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 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 指的是参数。
我的问题来了:
如果我必须遍历 std::map 而不是向量,如何使用 bind?
(抱歉所有的解释,我只是想确保我了解bind 的工作方式)
【问题讨论】:
-
总结一下,我的问题是
std::for_each将传递给我std::pair<key,Data>,而Filter::filter期望引用Data。 -
你为什么不直接来这个问题? :) 为什么你认为它与迭代向量有什么不同?
-
嗨 ArunMu,抱歉整个解释。我只是想确保我了解
bind的工作原理(也许我误解了一些东西)。与您的第二个问题相关,它会有所不同,因为现在函数对象接收std::pair而不是对下一个vector元素的引用。 -
还是不清楚:(。你的地图看起来像地图,?>.
-
地图看起来像:
std::map<int,Data>,我想对所有数据元素应用过滤器。也就是说,如果我调用:std::for_each (sampleMap.begin (),sampleMap.end (),boost::bind (&Filter::filter,filter,_1)),我会收到以下错误:error: no match for call to (boost::_mfi::mf1<void, Filter, Data&>) (Filter&, std::pair<const int, Data>&)。现在for_each正在传递std::pair,因为我正在迭代地图而不是矢量。