Я столкнулся с проблемой при очистке старого кода. Это функция:
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 для каждого «чанка».
По сути, я пришел к выводу, что гораздо проще, чище и короче оставить мой код как есть.
EDIT:
Итак, ближайший ответ на мой вопрос, как я предполагал, будет выглядеть так:
std::for_each( chunks.begin(), chunks.end(),
bind( &chunk_vec_t::value::type::get_connectivity_data,
_1,
output[ std::distance( _1, chunks.begn() ]
)
);
Тем не менее, этот код не компилируется, я внес некоторые изменения в код, чтобы заставить его компилироваться, но столкнулся с двумя проблемами:
- _ 1 - это умный ptr, и std :: distance не сработал, думаю, мне нужно было использовать & chunks [0] в качестве начала
- Поскольку _ 1 - это умный указатель, мне пришлось сделать: & chunk_vec_t :: value_ type :: ValueType :: get_ connectivity_ data, которая вызвала сбой в компиляторе VC9 ...
Ответ, касающийся итераторов zip_, выглядел неплохо, пока я не прочитал больше об этом и не обнаружил, что для этого конкретного использования количество дополнительного кода было существенным (связывание того и этого и т. Д.).
EDIT2:
Я нашел приемлемое решение с низким уровнем постороннего синтаксиса и ясностью, которое я разместил здесь и ниже.
std::transform(chunks.begin(), chunks.end(), back_inserter(tmp), boost::bind(&ADTChunk::get_connectivity_data, _1) );