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

Nested bind to member, need a pointer, got a reference. What do?

本文关键字:一个 引用 什么 绑定 嵌套 成员 指针      更新时间:2023-10-16

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

编译器错误是由于std::map构造了密钥类型,因此map_tvalue_type不是std::pair<long, std::unique_ptr<foo> >,而是std::pair<long const, std::unique_ptr<foo> >。为了避免这种错误,优选使用CCD_ 6。以下更改修复了错误:

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

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

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

或者,使用std::for_each和C++11 lambda:

for_each(foo_map_.begin(), foo_map_.end(), 
    [&bar_](map_t::value_type const& kv) { bar_.DoWork(&*kv.second); });

简单太棒了

您可以通过使用一个非常小的lambda来简化代码,而不是std::bind-疯狂,请参阅以下片段:

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