我有一个类的成员变量,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