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

コンパイラ エラーはstd::map、キーの型を const 化するため、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 ラムダを使用して:

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

シンプルさがすごい..

以下 のスニペットを参照してください。

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 に答える