在可变参数构造函数中初始化 const 数组

Initialize const array in a variadic constructor

我想从可变参数初始化一个常量数组。但是使用此代码仅初始化值数组中的第一个值,其余为零。 我该如何解决?

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

struct Object
{
    const int values[8];

    constexpr Object()
        : values{}
    {}

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

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

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

要修复第一个代码,您可以编写:

template<class ... Values>
constexpr Object(Values ... values)
    : values{values...}
{
    static_assert(sizeof...(values) == 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

需要在编译时知道数组的大小。所以你不能在调用构造函数时指定数组的长度,为时已晚。但是你可以在实例化模板时使用非类型参数。

Demo

从 C++17 开始我们可以利用 user-defined deduction guides:

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)>;

直播,here