嵌套绑定到成员,需要一个指针,得到一个引用。做什么?

时间:2012-07-17 19:29:35

标签: c++ visual-studio-2010 c++11 bind unique-ptr

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

2 个答案:

答案 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 ());
  }   
);