古いコードをクリーンアップしているときに問題が発生しました。これは機能です:
uint32_t ADT::get_connectivity_data( std::vector< std::vector<uint8_t> > &output )
{
output.resize(chunks.size());
for(chunk_vec_t::iterator it = chunks.begin(); it < chunks.end(); ++it)
{
uint32_t success = (*it)->get_connectivity_data(output[it-chunks.begin()]);
}
return TRUE;
}
私が興味を持っているのは、for ループをクリーンアップしてラムダ式にすることですが、正しい引数を get_connectivity_data に正確に渡す方法にすぐに行き詰まりました。get_connectivity_data は参照によって std::vector を受け取り、いくつかのデータで埋めます。出力には、各「チャンク」の std::vector が含まれます。
基本的に、これに対する私の結論は、コードをそのままにしておく方がはるかに簡単で、クリーンで、短いということでした。
編集:
したがって、私が想像していた私の質問に対する最も近い答えは次のとおりです。
std::for_each( chunks.begin(), chunks.end(),
bind( &chunk_vec_t::value::type::get_connectivity_data,
_1,
output[ std::distance( _1, chunks.begn() ]
)
);
それでも、そのコードはコンパイルされません。コンパイルできるようにコードにいくつかの変更を加えましたが、2 つの問題が発生しました。
- _ 1 はスマート ptr であり、std::distance は機能しませんでした。開始点として &chunks[0] を使用する必要があったと思います
- _ 1 はスマート ポインターであるため、次のことを行う必要がありました。
zip_ iterators に関する答えは、さらに詳しく読んで、この特定の用途に必要な余分なコードの量がかなりのものであることを発見するまで (これとあれをバインドするなど)、良さそうに見えました。
EDIT2:
ここと下に投稿した、余分な構文が少なく、明確な許容可能な解決策を見つけました。
std::transform(chunks.begin(), chunks.end(), back_inserter(tmp), boost::bind(&ADTChunk::get_connectivity_data, _1) );