создать range и передать его в функцию
От: DTF  
Дата: 05.03.22 10:57
Оценка:
Добрый день.

Я начал разбираться что за зверь такой эти 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);
}


Как это сделать?
Или я чего-то не понимаю, и так нельзя?
Отредактировано 05.03.2022 11:36 DTF . Предыдущая версия .
Re: создать range и передать его в функцию
От: watchmaker  
Дата: 05.03.22 12:10
Оценка: +1
Здравствуйте, DTF, Вы писали:


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) { }

}
Re: создать range и передать его в функцию
От: Андрей Тарасевич Беларусь  
Дата: 05.03.22 17:10
Оценка:
Здравствуйте, DTF, Вы писали:

DTF>Я начал разбираться что за зверь такой эти ranges, и что-то не могу понять, как с ними работать.


Это пркекрасно.

DTF>Вот вроде бы простая хотелка:

DTF>взять vector<int> или list<int>, отфильтровать значения,
DTF>результат передать в нешаблонную функцию, в этой функции проитерироваться по полученному диапазону

На уровне "начал разбираться" ответ — никак. Откуда вообще возник такой вопрос у человека, который только "начал разбираться"? Почему вы решили что ranges должны как-то решать эту задачу именно через нешаблонную функцию? Никаких свойств для устранения такой шаблонности в базовой функциональности ranges нет.
Best regards,
Андрей Тарасевич
Отредактировано 05.03.2022 17:12 Андрей Тарасевич . Предыдущая версия .
Re: создать range и передать его в функцию
От: Alexander_S_U https://github.com/alexanders-code/cmdxmlinstaller
Дата: 05.03.22 19:55
Оценка: -1 :)
Здравствуйте, 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)); 
  
}
https://github.com/alexanders-code/cmdxmlinstaller
Re[2]: создать range и передать его в функцию
От: Андрей Тарасевич Беларусь  
Дата: 06.03.22 03:05
Оценка: +1
Здравствуйте, 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 вот такой вариант откомпилировала


Но это вариант с шаблонной функцией, а автор вопроса хотел нешаблонную.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.