c++ - C++ 17遍历参数包的子集

标签 c++ algorithm templates c++17 metaprogramming

我有一个接收参数包的结构。假设参数包的大小永远不会小于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/

相关文章:

c++ - 这个归并排序算法做了多少次比较?

algorithm - 从图像中提取稳健的线

c - 是否有用于将结构作为 Zobrist key 键入的算法?

c++ - 如果使用嵌套命名空间,如何转发声明 C++ 结构?

java - 什么使用 libharu c++ 或我文本 java

python - 从 2D numpy 数组中删除运行

c++ - () 仿函数后的括号而不是函数指针?

c++ - 如何强制编译器选择特定的函数特化

c++ - 为什么模板只能在头文件中实现?

c++ - 创建教程模式