Шаблон вложенности - PullRequest
       10

Шаблон вложенности

0 голосов
/ 05 февраля 2019

У меня есть два класса, которые используют списки инициализации.Одним из них является класс в векторном стиле, содержащий список значений.

Vec.h:

template< typename T, int nDimensions = 2 >
class Vec{
    private:
        std::array< T, nDimensions > elements_;
    public:
        template <typename... U>
        Vec(U... ts) : elements_{ ts... } {}
}

Тогда при использовании:

typedef Vec< int, 2 > Vec2i;
Vec2i twoi = { 1,2 };
Vec2i twoi2 = twoi; //I have copy constructor and other methods finished. 

Этот класс работает нормальнои, конечно же, когда я пытаюсь использовать этот класс с моим классом в стиле Matrix, я не могу понять правильный синтаксис его конструктора.

template< typename T, int X,int Y>
class Mat {
   private:
     std::array< Vec<T, X>, Y > elements_;
}

Я бы хотел использовать его следующим образом:

typedef Mat<int, 3,3> Mat3i;
Mat3i threemat = {  {1,2,3},
                    {4,5,6},
                    {7,8,9}};

Теперь, iv попытался использовать списки инициализаторов в качестве конструктора с некоторым успехом, но я не могу понять синтаксис для передачи подсписков.

Mat(std::initializer_list<Vec<T, X>> values) {
    for (auto& t : values) {
        //What goes here?
    }
}

Iv также пробовал перебирать список и назначатьих вручную, но это не пойдет.

Стоит также отметить, что важно, чтобы эти классы имели последовательные фрагменты памяти для списков там, и никаких других переменных.В противном случае id будет использовать другие типы вместо std :: array.(Для приведения и объединения.)

Я спорю, нужно ли мне переосмыслить приведение каждого значения как Vec, а затем скопировать значения.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Как альтернатива:

Mat(std::initializer_list<Vec<T, X>> values) {
    std::copy(values.begin(), values.end(), elements_.begin());
}
0 голосов
/ 05 февраля 2019

Я идиот.

Mat(std::initializer_list<Vec<T, X>> values) {
    int i = 0;
    for (auto& t : values) {
        elements_[i++] = t;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...