首页 > 解决方案 > 使用 rangev3 在 C++ 中模拟 python 样式的列表理解?

问题描述

使用 rangev3 库我可以做到这一点:

  auto march = view::iota(1,32)
              | view::transform(
                [](int i){return date(1995, greg::Mar, i);
                });

给我 1995 年 3 月的日期:

1995-Mar-01
...
1995-Mar-31

有没有办法以更接近 python 的语法来做到这一点:

[date(1995, Mar, i) for i in range(32)] 

特别是我觉得从日期/函数开始有助于代码的可读性。

标签: c++range-v3

解决方案


您将获得的最接近的是使用可变参数:

namespace detail {
  template <std::size_t ...Is>
  std::vector<date> generate(std::index_sequence<Is...>) {
    return {date(1995, greg::Mar, Is + 1)...}; // almost like Python
  }
}

std::vector<date> generate() {
  return detail::generate(std::make_index_sequence<32>());
}

但是现在您没有使用范围,您必须定义两个单独的函数。


推荐阅读