Допустим, я хочу написать простую функцию keys
это занимает std::map
и возвращает iterator_range
это обеспечивает ключи карты. Как бы я это сделал?
template<typename A, typename B>
Range<A> keys(const std::map<A, B> & m) { ??? }
Я хочу применить один и тот же шаблон к различным другим контейнерам, но я думаю, что это хороший пример-прототип.
Редактировать: Я предполагаю, что мне нужно что-то в сфере Boost’s range_adapter
и / или transform_iterator
с, но я недостаточно знаком с ними, чтобы применить их здесь.
Эта особая потребность удовлетворяется boost::adapters::keys
, В более общем смысле, boost::range
позволяет создавать собственные адаптеры, но это несколько сложнее. Так что, если вы не разрабатываете новую библиотеку, вы можете сойти с рук transformed
,
Если вам нужен результат вашего диапазона обратно в контейнер, вы можете написать простой collect
функция, которая будет «собирать» результат boost::range
трубопровод.
template<typename Output, typename SinglePassRange>
Output collect(const SinglePassRange & rng)
{
Output r;
boost::range::copy(rng, std::inserter(r, boost::begin(r)));
return r;
}
Теперь вы можете легко набрать несколько маленьких функций и
collect<vector<int>>(numbers | filtered(odd))
collect<vector<int>>(numbers | transformed(doubled))
collect<vector<K>>(myMap | transformed(keyOf))
Других решений пока нет …