【发布时间】:2022-01-17 00:33:50
【问题描述】:
我正在尝试使用 C++20 范围实现重复 n 次。
works,但我能想到的所有方法都需要一个虚拟变量(一个用于 for 循环变量,另一个用于 lambda 的数量)。
static constexpr int kIterations = 3;
void f1(){
auto c = '.';
for (const auto _ :std::views::iota(0)| std::views::take(kIterations) ) {
std::cout << c;
}
std::cout << std::endl;
}
void f2(){
auto c = '.';
std::ranges::for_each(std::views::iota(0)| std::views::take(kIterations), [&c](const auto _) {
std::cout << c;
});
std::cout << std::endl;
}
有没有一种方法可以在不需要虚拟变量的情况下使用 C++20 范围执行此操作(在我的情况下为 _,但即使未命名也需要 const?auto)。
注释:
- 我知道我可以使用 C for 循环????,我有兴趣以 C++20 范围的方式执行此操作。
- 我想我可以自己在算法中实现这一点,但我想知道我是否可以在不实现
repeat_n的情况下“内联”实现它 - 我知道
iota的版本需要 2 个整数,它可能更具可读性,但仍然不能解决虚拟变量的问题。 - 逻辑被简化,只是为了展示捕获
【问题讨论】:
-
range-v3 有
views::repeat和views::repeat_n。 -
在 lambda 中你至少可以省略命名变量。
-
转换iota视图也使用了一个虚拟变量
for (const auto e : std::views::iota(0, kIterations) | std::views::transform([&c](int){ return c }) { std::cout << e; }。 -
@super true,我的错,但它仍然需要 auto/const auto
-
@NoSenseEtAl,你能澄清一下你想做什么吗?您是否尝试依赖 C++20 的
<ranges>在 C++20 中实现 Range-v3 的repeat_n?如果是这样,f1和f2在调用repeat_n([&c](const auto _) { std::cout << c; })时是否符合您的预期?我已经给出了答案,但后来删除了它,因为我认为我误解了。
标签: c++ c++20 std-ranges