В range-v3, как мне создать диапазон из пары итераторов? - PullRequest
2 голосов
/ 10 октября 2019

Как создать диапазон, совместимый с диапазонами v3, с учетом традиционной пары итераторов «начало» и «конец»?

Допустим, я пишу обобщенную функцию, которая принимает два итератора, длясовместимость с устаревшим кодом.

struct result;  

bool keep_line(const std::string&);
result parse_line(const std::string&);

template <typename InputIt>
std::vector<result> parse_lines(InputIt begin, InputIt end)
{
    // This is what I want to do...
    auto lines = ranges::make_range_out_of_legacy_iterators(begin, end);

    return lines 
        | ranges::view::filter(keep_line) 
        | ranges::view::transform(parse_line) 
        | ranges::to<std::vector<result>>();
}

1 Ответ

3 голосов
/ 10 октября 2019

Чтобы создать диапазон из пары итераторов в range-v3, используйте subrange view :

#include <range/view/subrange.hpp>

auto lines = ranges::subrange(begin, end);       // Requires C++17-style deduction

auto lines = ranges::make_subrange(begin, end);  // If template deduction not available

В старых версиях библиотеки iterator_rangeкласс в range/v3/iterator_range.hpp, по-видимому, использовался, но этот заголовок помечен как устаревший в текущем выпуске ranges-v3 (0.9.1).

...