创建相互划分的向量的连续元素元组



我有一个类的成员变量,offsets,它是一个至少包含N+1个元素的向量。我想创建一个成员函数,它将返回一个元组,其中包含N个条目,其中包含向量的连续元素的值彼此除以。下面显示了此函数的特定实例的示例,当N=3时。

std::tuple<3> get_shape()
{
return std::make_tuple(offsets[N]/offsets[N-1], offsets[N-1]/offsets[N-2], offsets[N-2]/offsets[N-3]);
}

有没有办法推广这个序列来实现函数std::tuple<N> get_shape()

您可以使用std::index_sequence来实现这一点。

template<size_t N>
struct foo {
std::array<double, N + 1> offsets;
auto get_tuple() const {
auto make_tuple = 
[this]<typename I, I... idx>(std::index_sequence<idx...>) {
return std::make_tuple((offsets[N - idx] / offsets[N - idx - 1])...);
};
return make_tuple(std::make_index_sequence<N>());
}
};

std::make_index_sequence<N>变成了std::index_sequence<0, 1, 2, ... N - 1>.自 c++20 以来,这可以应用于模板化 lambda。我们可以通过可变参数I... idx访问0, 1, 2, ... N - 1.现在说...std::make_tuple将所有idx数字解压缩到N参数

int main() {
foo<3> f = { 2, -4, 7, 1 };
auto tuple = f.get_tuple();
static_assert(std::is_same_v<decltype(tuple), std::tuple<double, double, double>>);
std::apply([](auto&&... rest) {
((std::cout << rest << " "), ...);
}, tuple);
}

输出:

0.142857 -1.75 -2

最新更新