Инициализировать массив const в вариативном конструкторе

Я хочу инициализировать массив const из переменных параметров. Но с этим кодом инициализируется только первое значение в массивах значений, остальные - нули. Как это исправить?

Я никогда не имел дело с вариативными параметрами и не знаю, как они в принципе работают.

struct Object
{
    const int values[8];

    constexpr Object()
        : values{}
    {}

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

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

Дополнительный вопрос: можно ли написать шаблон класса и сделать размер его массива равным количеству вариативных параметров?


person Emil Kabirov    schedule 22.09.2019    source источник


Ответы (2)


Начиная с C++17, мы можем воспользоваться определяемыми пользователем руководствами по дедукции< /а>:

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

Прямой эфир, здесь.

person Bob__    schedule 22.09.2019
comment
Это потрясающе, это то, что я хочу: перейти от вариативных параметров к их количеству N и построить какой-нибудь Object‹N› - person Emil Kabirov; 22.09.2019

Чтобы исправить первый код, вы можете написать:

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

Размер массива должен быть известен во время компиляции. Таким образом, вы не можете указать длину массива при вызове конструктора, это слишком поздно. Но вы можете использовать нетиповые параметры при создании экземпляра шаблона.

Демо

person rafix07    schedule 22.09.2019