gpt4 book ai didi

c++ - 通过来自任意索引的参数包初始化 std::array

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:33 24 4
gpt4 key购买 nike

通过可变模板参数初始化一个 std::array,从给定的索引开始可以通过以下方式完成:

#include <array>

template <typename T, size_t N>
struct A
{
template <typename ... Ts>
A(size_t i, Ts ... vals)
{
constexpr size_t P = sizeof...(vals);
std::array<T, P> temp{ vals... };

for (size_t j = 0; j < P; ++j)
{
arr[i + j] = temp[j];
}
}

std::array<T, N> arr;
};

但是否可以在不将参数包转换为临时元组或另一个 std::array 的情况下实现相同的目的?

最佳答案

您可以使用 std::index_sequence 和委托(delegate)构造函数:

template <typename T, size_t N>
struct A
{
template <typename ... Ts>
A(size_t i, Ts&& ... vals)
:
A(std::index_sequence_for<Ts...>{}, i, std::forward<Ts>(vals)...)
{}

template <std::size_t...Is, typename ... Ts>
A(std::index_sequence<Is...>, size_t i, Ts&& ... vals)
{
int dummy[] = {0, ((arr[i + Is] = vals), void(), 0)...};
static_cast<void>(dummy); // Avoid warning for unused variable
}

std::array<T, N> arr;
};

或者用C++17的折叠表达式,

   template <std::size_t...Is, typename ... Ts>
A(std::index_sequence<Is...>, size_t i, Ts&& ... vals)
{
(static_cast<void>(arr[i + Is] = vals), ...);
}

关于c++ - 通过来自任意索引的参数包初始化 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com