I'm trying to get a range
like python like below:
#include <iostream>
#include <ranges>
auto Range(double start, double end, double step)
{
if (start <= end) {
auto step_fun = [=](auto x) { return x * step + start; };
auto end_pred = [=](auto x) { return x <= end; };
auto range =
std::views::iota(0)
| std::views::transform(step_fun)
| std::views::take_while(end_pred);
return range;
}
else {
auto step_fun = [=](auto x) { return -x * step + start; };
auto end_pred = [=](auto x) { return x >= end; };
auto range =
std::views::iota(0)
| std::views::transform(step_fun)
| std::views::take_while(end_pred);
return range;
}
}
int main() {
auto range = Range(108, 100, 1);
for (auto i : range)
std::cout << i << ' ';
return 0;
}
But the Visual Studio told me:
Error C3487 'std::ranges::take_while_view<std::ranges::transform_view<std::ranges::iota_view<_Ty,std::unreachable_sentinel_t>,Range::<lambda_3>>,Range::<lambda_4>>': all return expressions must deduce to the same type: previously it was 'std::ranges::take_while_view<std::ranges::transform_view<std::ranges::iota_view<_Ty,std::unreachable_sentinel_t>,Range::<lambda_1>>,Range::<lambda_2>>'
and
Message No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called test
But only start>end
orstart<end
,it can work,like:
auto Range(double start, double end, double step)
{
auto step_fun = [=](auto x) { return x * step + start; };
auto end_pred = [=](auto x) { return x <= end; };
auto range =
std::views::iota(0)
| std::views::transform(step_fun)
| std::views::take_while(end_pred);
return range;
}
How can I fix it?