C++ 在可变构造函数中初始化常量数组

C++ 在可变构造函数中初始化常量数组,c++,constructor,constants,variadic,C++,Constructor,Constants,Variadic,我想从可变参数初始化常量数组。但是,对于这段代码,只有值数组中的第一个值被初始化,其余值是零如何修复它? 我从未处理过可变参数,也不知道它们基本上是如何工作的 struct Object { const int values[8]; constexpr Object() : values{} {} constexpr Object(int values...) : values{values} {} } // in m

我想从可变参数初始化常量数组。但是,对于这段代码,只有值数组中的第一个值被初始化,其余值是零如何修复它?

我从未处理过可变参数,也不知道它们基本上是如何工作的

struct Object
{
    const int values[8];

    constexpr Object()
        : values{}
    {}

    constexpr Object(int values...)
        : values{values}
    {}
}

// in main.cpp :
Object o = { 1, 2, 3 };

附加问题:我可以编写一个类模板并使其数组大小等于可变参数计数吗?

要修复可以编写的第一个代码,请执行以下操作:

template<class ... Values>
constexpr Object(Values ... values)
    : values{values...}
{
    static_assert(sizeof...(values) == 8);
}
模板
constexpr对象(值…值)
:values{values…}
{
静态断言(sizeof…(值)==8);
}
关于你的补充问题:

template<int ... ints>
struct Object2
{
    const int values[sizeof...(ints)]{ints...};
};
Object2<1,21,3> o2; // array with 3 elements
std::cout << o2.values[1] << std::endl; // 21
模板
结构对象2
{
常量int值[sizeof…(ints)]{ints…};
};
Object2 o2;//包含3个元素的数组

std::cout由于C++17,我们可以利用:

模板
类对象
{
T d_[N];
公众:
Object()=默认值;
模板
constexpr对象(Ts…others):d{others…}{
constexpr auto size()const noexcept{return N;}
constexpr自动运算符[](size_t i)const noexcept{return d_[i];}
};
//扣除指南
模板对象(T,Ts…)->对象;

现场,.

这太神奇了,这就是我想要的:从可变参数到它们的数字N,然后构建一些对象
template <class T, size_t N>
class Object
{
    T d_[N];
public:
    Object() = default;

    template <class... Ts>
    constexpr Object(Ts... others) : d_{others...} {}

    constexpr auto size() const noexcept { return N; }

    constexpr auto operator[] (size_t i) const noexcept { return d_[i]; }
};

// Deduction guide
template <class T, class... Ts> Object(T, Ts...) -> Object<T, 1 + sizeof...(Ts)>;