我有一个foo类型的std :: unique_ptr的地图,我正在尝试迭代地图,将每个值传递给不在地图中的foo的公共成员。我很接近,但我无法弄清楚如何将内部绑定的结果从引用转向指针。
假设:
class foo
{
public:
bool DoWork(foo *);
};
std::map<long, std::unique_ptr<foo> map_t;
map_t foo_map_;
foo bar_;
std::for_each(std::begin(foo_map_), std::end(foo_map_), std::bind(&Foo::DoWork, &bar_, std::bind(&std::unique_ptr<foo>::get, /* This guy here -->*/std::bind(&std::pair<long, std::unique_ptr<foo>>::second, std::placeholders::_1))));
建议?我正在使用Visual Studio 2010 SP1。
答案 0 :(得分:1)
编译器错误是由于std::map
const'化了密钥类型,因此value_type
的{{1}}不是map_t
而是{{1} }}。为避免此类错误,请使用std::pair<long, std::unique_ptr<foo> >
。以下更改修复了错误:
std::pair<long const, std::unique_ptr<foo> >
在C ++ 11中,您可以将其简化为:
map_t::value_type
或者,使用... std::bind(&map_t::value_type::second, std::placeholders::_1) ...
和C ++ 11 lambda:
for(auto const& kv : foo_map_)
bar_.DoWork(&*kv.second);
答案 1 :(得分:1)
您可以使用非常小的 lambda 而不是 std :: bind -madness来简化代码,请参阅以下代码段:
foo obj;
typedef std::map<long, std::unique_ptr<foo>> fooMap;
fooMap map_t;
std::for_each (
map_t.begin (), map_t.end (),
[&obj](fooMap::value_type& elem) {
obj.DoWork (elem.second.get ());
}
);