При инициализации std::array

Допустим, у вас есть член c++0x std::array класса шаблона, и вы хотите инициализировать его с помощью конструктора, который принимает пару итераторов:

template <typename Tp, size_t N>
class Test 
{
public:
    template <typename Iterator>
    Test(Iterator first, Iterator last)
    {
        if (std::distance(first,last) > N )
            throw std::runtime_error("bad range");
        std::copy(first, last, _M_storage.begin());
    }

private:
    std::array<Tp, N> _M_storage;

};

Предполагая, что вы предоставляете диапазон, соответствующий размеру вашего хранилища, возможно ли инициализировать std::array в инициализаторе конструктора, избегая лишних конструкторов Tps по умолчанию в хранилище? Можно ли использовать std::initializer_list‹> в этом случае?


person Nicola Bonelli    schedule 22.07.2010    source источник
comment
Кстати, идентификатор, начинающийся со знака подчеркивания и заканчивающийся заглавной буквой, зарезервирован. Кроме того, это должно быть std::distance(first, last).   -  person GManNickG    schedule 22.07.2010
comment
Оплошность исправлена. Проблема с дополнительными конструкторами по умолчанию остается...   -  person Nicola Bonelli    schedule 22.07.2010


Ответы (1)


No.

std::array является агрегатом, поэтому вы не получаете никаких специальных функций, таких как конструкторы, использующие итераторы. (Это на самом деле меня удивляет, с введением std::initializer_list я не вижу никакого вреда в создании других полезных конструкторов. Возможно, вопрос в запасе.)

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

person GManNickG    schedule 22.07.2010