Создайте список инициализатора различного размера в зависимости от параметра шаблона - PullRequest
0 голосов
/ 11 июня 2018

У меня есть класс, который содержит массив объектов T без конструктора по умолчанию.Вот пример:

#include <iostream>

struct Param {
    int x;
};

struct A {
    A(const Param &p) {
        std::cout << p.x << std::endl;
    }
};

template<class T, int n>
struct Array {
    T data[n];
                                 /*     n times     */
    Array(const Param &p) : data{/* T(p), ..., T(p) */} { }
};

int main() {
    Param p{42};
    Array<A, 3> arr(p);
    return 0;
}

Я ищу способ инициализации поля data с использованием списка инициализаторов переменного размера T(p), содержащего ровно n элементов.У меня есть ощущение, что это может быть достигнуто с помощью какой-то конструкции, например std::make_index_sequence, но я не нашел ничего подходящего.

1 Ответ

0 голосов
/ 11 июня 2018

Полагаю, вы можете использовать делегирующий конструктор std::index_sequence и std::make_index_sequence и переписать Array следующим образом (Редактировать: ответ улучшен SergeyA и Rakete1111; спасибо!)

template <typename T, std::size_t N>
struct Array
 {
    T data[N];

    template <std::size_t ... Is>
    Array (Param const & p, std::index_sequence<Is...> const &)
       : data { ((void)Is, T{p}) ... }
     { }

    Array(const Param &p) : Array{p, std::make_index_sequence<N>{}}
     { }
 };

Может быть, выможет сделать private новым конструктором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...