0

我有一个 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。

4

2 回答 2

1

编译器错误是由于 const'ify 键类型的事实std::map,因此value_typeofmap_t不是std::pair<long, std::unique_ptr<foo> >而是std::pair<long const, std::unique_ptr<foo> >。为避免此类错误,最好使用map_t::value_type. 以下更改修复了该错误:

... std::bind(&map_t::value_type::second, std::placeholders::_1) ...

在 C++11 中,您可以将其简化为:

for(auto const& kv : foo_map_)
    bar_.DoWork(&*kv.second);

或者,使用std::for_eachC++11 lambda:

for_each(foo_map_.begin(), foo_map_.end(), 
    [&bar_](map_t::value_type const& kv) { bar_.DoWork(&*kv.second); });
于 2012-07-17T19:33:12.093 回答
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 ());
  }   
); 
于 2012-07-17T19:40:16.327 回答