我可以让`std::ranges::views::elements`与我的类型范围一起工作吗
考虑Point带有x,y和z值的类型。如果我有一系列Point对象,例如std::vector<Point>,我需要添加什么Point才能使其与std::ranges::views::elements范围适配器一起使用?
目的是做类似的事情
std::vector<Point> v{...};
for (auto x : v | std::ranges::views::elements<0>) {
// do something with all `x` values
}
该文档提到std::ranges::views::elements适用于“类似元组”的值。我假设它的工作方式应该类似于我们如何使我们的类型与结构化绑定一起工作,但我似乎遗漏了一些东西
我已尝试使用以下代码
class Point {
double x=0;
double y=0;
double z=0;
public:
Point(double x, double y, double z) : x(x), y(y), z(z) {}
template <std::size_t N>
double get() const {
if constexpr(N == 0)
return x;
else if constexpr(N == 1)
return y;
else if constexpr(N == 2)
return z;
}
};
namespace std {
template <>
struct tuple_size<Point> : std::integral_constant<std::size_t, 3> {};
template <std::size_t N>
struct tuple_element<N, Point> {
using type = double;
};
}
这足以使结构化绑定工作,但std::ranges::views::elements仍然不起作用。然后我认为可能std::ranges::views::elements需要std::get<n>(p)工作,我在下面的std命名空间中添加了一个专业化
template <std::size_t N>
double get(const Point &p) {
if constexpr(N == 0)
return p.get<0>();
else if constexpr(N==1)
return p.get<1>();
else if constexpr(N==2)
return p.get<2>();
}
现在可以使用 std::get<0>(p) 来提取x值,但这对于std::ranges::views::elements. 使一系列Point对象一起工作还需要std::ranges::views::elements什么?
PS:我知道我可以在views::transform这里使用 a ,但我在这里的主要目的是通用并了解这些东西是如何组合在一起的。通用并了解这些东西是如何组合在一起的。
THE END
二维码