我有一個類的成員變數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()?
uj5u.com熱心網友回復:
您可以使用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>. 這可以應用于模板化的 lambda,因為c 20. 我們可以0, 1, 2, ... N - 1通過可變引數訪問I... idx。現在說...insidestd::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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/504922.html
