Я начал разбираться что за зверь такой эти ranges, и что-то не могу понять, как с ними работать.
Вот вроде бы простая хотелка:
взять vector<int> или list<int>, отфильтровать значения,
результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону
Т.е. что-то такое:
bool IsEven(int i)
{
return i % 2 == 0;
}
void Foo(a_strange_type<int> range)
{
for (int i : range)
std::cout << i << std::endl;
}
int main()
{
std::vector<int> v = {1, 2, 3};
std::list<int> l = {4, 5, 6};
Foo(v | IsEven);
Foo(l | IsEven);
}
Как это сделать?
Или я чего-то не понимаю, и так нельзя?
DTF>Вот вроде бы простая хотелка: DTF>взять vector<int> или list<int>, отфильтровать значения, DTF>результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону
Тогда тебе в придётся делать type-erasure, как, например, делает any_view в ranges-v3:
void Foo(ranges::any_view<int, ranges::category::forward> range) {
for (int i : range) { }
}
Здравствуйте, DTF, Вы писали:
DTF>Я начал разбираться что за зверь такой эти ranges, и что-то не могу понять, как с ними работать.
Это пркекрасно.
DTF>Вот вроде бы простая хотелка: DTF>взять vector<int> или list<int>, отфильтровать значения, DTF>результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону
На уровне "начал разбираться" ответ — никак. Откуда вообще возник такой вопрос у человека, который только "начал разбираться"? Почему вы решили что ranges должны как-то решать эту задачу именно через нешаблонную функцию? Никаких свойств для устранения такой шаблонности в базовой функциональности ranges нет.
Здравствуйте, DTF, Вы писали:
DTF>Добрый день.
DTF>Я начал разбираться что за зверь такой эти ranges, и что-то не могу понять, как с ними работать.
DTF>Вот вроде бы простая хотелка: DTF>взять vector<int> или list<int>, отфильтровать значения, DTF>результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону
...
Visual Studio 2019 16.11.10 с ключом /std:c++latest вот такой вариант откомпилировала
#include <ranges>
#include <iostream>
#include <vector>
#include <list>
bool IsEven(int i)
{
return i % 2 == 0;
}
void Foo(auto r)
{
for (int i : r)
std::cout << i << std::endl;
}
int main()
{
std::vector<int> v = {1, 2, 2};
std::list<int> l = {4, 5, 6};
Foo(v | std::views::filter(IsEven));
std::cout << '\n';
Foo(l | std::views::filter(IsEven));
}
Здравствуйте, Alexander_S_U, Вы писали:
A_S>Здравствуйте, DTF, Вы писали:
DTF>>Добрый день.
DTF>>Я начал разбираться что за зверь такой эти ranges, и что-то не могу понять, как с ними работать.
DTF>>Вот вроде бы простая хотелка: DTF>>взять vector<int> или list<int>, отфильтровать значения, DTF>>результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону
A_S>...
A_S>Visual Studio 2019 16.11.10 с ключом /std:c++latest вот такой вариант откомпилировала
Но это вариант с шаблонной функцией, а автор вопроса хотел нешаблонную.