gpt4 book ai didi

c++ - 创建具有扩展索引序列的结构

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:26 25 4
gpt4 key购买 nike

我希望能够在构造函数的初始化列表中使用参数包扩展。实现此目标的最佳方法是为我的类赋予参数包模板参数吗?这是我的意思的一个例子: https://coliru.stacked-crooked.com/a/e699c4cd035e0b1c

#include <utility>
#include <iostream>

template<typename T, std::size_t...Is>
struct base_vec
{
constexpr static std::size_t N = sizeof...(Is);
T e[N];
base_vec() : e{} {}
explicit base_vec(const T& s) : e{((void)Is,s)...} {}
};


template<typename T, std::size_t...Is>
std::ostream& operator<<(std::ostream& lhs, const base_vec<T,Is...>& rhs)
{
return (std::cout << ... << rhs.e[Is]);
}



template<typename T, std::size_t...Is>
constexpr auto getVecIs(std::index_sequence<Is...> seq)
{
return base_vec<T, Is...>{};
}




template<typename T, std::size_t N>
using vec = decltype(getVecIs<T>(std::declval<std::make_index_sequence<N>>()));

int main()
{
vec<int,3> v(2);
std::cout << v << "\n";
return 0;
}

注意简单的扩展 e{((void)Is,s)...}。这是一个好的做法,还是我错过了这种方法的一些缺点(除了现在我的结构将有一个完整的参数包,而不是单个 size_t N)?

最佳答案

您可以将扩展完全移动到类中:

template<typename T, std::size_t N>
struct vec
{
public:
T e[N];
vec() : e{} {}
explicit vec(const T& s) : vec{s, std::make_index_sequence<N>{}} {}
private:
template <std::size_t ... Is>
vec(const T& s, std::index_sequence<Is...>) : e{(Is, s)...} {}
};

关于c++ - 创建具有扩展索引序列的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58503890/

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