Создайте std :: array и инициализируйте объекты элемента с помощью кода - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу инициализировать элементы массива, избегая при этом ненужных экземпляров и копий (аналогично этому вопросу: инициализация std :: array без копирования / перемещения элементов ).

Список инициализаторов выполняетработать с небольшим количеством объектов.

Бит Я хочу сделать это с помощью фрагмента кода, поскольку мой массив состоит из нескольких сотен элементов ...

Как я могу это сделать?

#include <array>
#include <iostream>

class mytype {
public:
    int a;
    mytype() : a(0) {}
    mytype(int a) : a(a) {}
};

int main() {
    // explict constructor calls to instantiate objects does work
    std::array<mytype, 2> a = { { mytype(10), mytype(20) } };
    std::cout << a[0].a;  // 10

    // I want to do something like this - what does not work of course
    std::array<mytype, 2> b = { { for (i = 0, i++, i < 2) mtype(10 * i); } };
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

In :

#include <array>
#include <utility>
#include <cstddef>

template <typename T, std::size_t... Is>
std::array<T, sizeof...(Is)> to_array(std::index_sequence<Is...>)
{
    return { T(Is*10)... };
}

template <typename T, std::size_t N>
std::array<T, N> to_array()
{
    return to_array<T>(std::make_index_sequence<N>{});
}

int main() 
{
    std::array<mytype, 10> b(to_array<mytype, 10>());
}

DEMO

0 голосов
/ 02 декабря 2018

Обычно это выполняется с помощью пары шаблонов:

namespace detail {
    template<std::size_t... Idx>
    auto make_mytype_array(std::index_sequence<Idx...>) {
        return std::array<mytype, sizeof...(Idx)>{{
            mytype(10 * Idx)...
        }};
    }
}

template<std::size_t N>
auto make_mytype_array() {
    return detail::make_mytype_array(make_index_sequence<N>{});
}

Выше приведена пара бесполезных функций, но при необходимости ее можно сложить в класс.Если вам нужно больше, чем просто выражение типа 10*i, тогда лямбда-выражение может быть передано в качестве другого аргумента (обычно это «вызываемый»).С копией elision это все свернется в прямую инициализацию объекта массива результата.

...