C++ C++;17迭代参数包的子集

C++ C++;17迭代参数包的子集,c++,algorithm,templates,c++17,metaprogramming,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, s

我有一个接收参数包的结构。让我们假设参数包的大小永远不会小于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::数组arr{};
};
int main(){
康斯特普街;

std::cout我认为最简单的方法是执行以下操作:

#包括
#包括
#包括
样板
constexpr std::数组创建_arr(){
常量std::数组tmp{Ts..};
std::数组ret{};
//对于C++20,这是对std::copy的调用
对于(自动i=0ul;i!=tmp.size()-1;++i){
ret[i]=tmp[i];
}
返回ret;
}
样板
结构街{
const std::array arr=create_arr();
};
int main(){
康斯特普街;

std::cout我认为最简单的方法是执行以下操作:

#包括
#包括
#包括
样板
constexpr std::数组创建_arr(){
常量std::数组tmp{Ts..};
std::数组ret{};
//对于C++20,这是对std::copy的调用
对于(自动i=0ul;i!=tmp.size()-1;++i){
ret[i]=tmp[i];
}
返回ret;
}
样板
结构街{
const std::array arr=create_arr();
};
int main(){
康斯特普街;

std::cout可能的解决方案,使用
std::index\u序列

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]...} {}
};
模板
结构街{
静态constexpr auto Size=sizeof…(Ts)-2;
常数std::数组arr;
constexpr St():St(std::array{Ts..},std::make_index_sequence{})
私人:
样板
constexpr St(arrinit,std::index_序列):Arr{init[I+1]…}{
};

使用
std::index\u序列的可能解决方案

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]...} {}
};
模板
结构街{
静态constexpr auto Size=sizeof…(Ts)-2;
常数std::数组arr;
constexpr St():St(std::array{Ts..},std::make_index_sequence{})
私人:
样板
constexpr St(arrinit,std::index_序列):Arr{init[I+1]…}{
};

我可能误解了某些内容,但我认为
arr
应该是常量,因为相同结构的对象会更多对不起,我的错误。修复了它!我可能误解了某些内容,但我认为
arr
应该是常量,因为相同结构的对象会更多对不起,我的错误。修复了我的错误t!我把uint32换成了int32,谢谢你的留言!我把uint32换成了int32,谢谢你的留言!