我有一个接收参数包的结构。假设参数包的大小永远不会小于3。而且,在编译时应评估结构中找到的std::array
。我想使用参数包填充数组,但是我想跳过第一个和最后一个元素。
这是我的代码:
#include <iostream>
#include <array>
#include <cstdint>
template<int32_t ...Ts>
struct St {
const std::array<int32_t, sizeof...(Ts)-2U> arr{};
};
int main() {
constexpr St<7, 2, 1, 5, 6> s;
std::cout << s.arr[2] << std::endl;
return 0;
}
理想情况下,我想将
std::index_sequence
与[1,sizeof_parameter_pack-1]或[0,size_of_parameter_pack-2]中的元素一起使用,并使用fold表达式来填充数组。但是,我正在努力创建index_sequence。我不希望该结构接收另一个模板参数。我该如何实现?
最佳答案
std::index_sequence
的可能解决方案:
template<int32_t... Ts>
struct St {
static constexpr auto Size = sizeof...(Ts) - 2;
const std::array<int32_t, Size> arr;
constexpr St() : St(std::array{Ts...}, std::make_index_sequence<Size>{}) {}
private:
template<class Arr, std::size_t... I>
constexpr St(Arr init, std::index_sequence<is...>) : arr{init[I + 1]...} {}
};
关于c++ - C++ 17遍历参数包的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59812886/