我希望能够使用 C++ 范围通过压缩容器来帮助简化代码逻辑,而不是显式索引它们。我可以让它与一个冗长的 lambda 参数一起工作,但我宁愿尝试用 more 使它更简单/可概括auto
。
const int n = ...;
std::vector<float> a(n), b(n), c(n);
...initialize a and b...
// This works
ranges::for_each(
ranges::views::zip(a, b, c),
[](const std::tuple<float&, float&, float&>& v)
{
const auto& [a, b, c] = v;
c = a + b;
std::cout << typeid(v).name(); // NSt3__15tupleIJRfS1_S1_EEE
}
);
// This fails
ranges::for_each(
ranges::views::zip(a, b, c),
[](const auto& v)
{
const auto& [a, b, c] = v;
// c = a + b;
std::cout << typeid(v).name(); // N6ranges12common_tupleIJRfS1_S1_EEE
}
);
Ranges-v3文档说明如下:
views::zip
给定N个范围,返回一个新范围,其中第 M 个元素是调用所有N
make_tuple
个范围的第 M 个元素的结果。
这让我认为我应该能够将 转换ranges::common_tuple
为std::tuple
,我查看了公共成员并发现:
std::tuple< Ts... > const & base() const noexcept
但是,这也不能编译:
const auto& [a, b, c] = v.base();
// error: no member named 'base' in 'std::__1::tuple<float, float, float>'
但是当我打印typeid(v)
它时,它不是std::tuple
;它是ranges::common_tuple
。我在这里尝试做的auto
类型推断是否可行?(如果重要的话,编译器)