Как создать класс-оболочку std::array

Задний план:

Я пытаюсь создать несколько собственных классов-оболочек для контейнеров STL, чтобы я мог отделить реализацию от своей базы кода. Я уже немного поработал с оболочкой класса Vector:

Вектор.h

template<typename type>
    class Vector
    {
    public:
        Vector();
        Vector(std::initializer_list<type> initializer);
        Vector(int size, int defaultValue);
        Vector(int size);
        ~Vector();

        void PushBack(type itemToPushBack);
        type AtPosition(int position);

    private:
        std::vector<type> m_collectionOfItems;
    }; 

Как видите, у меня настроены конструкторы, и я использовал std::vector в качестве члена, так что я могу просто вызывать функции std::vector в своих собственных классах Vector.

Проблема:

С std::array я должен сразу указать размер при создании экземпляра любого объекта. Поэтому, если бы я создал переменную-член, как я сделал с моим векторным классом, мне пришлось бы указать размер этого объекта массива. Я бы предпочел, чтобы размер указывался пользователем с помощью настройки конструктора, аналогичной вектору (например, MyArrayClass myArray(10) ). Как я могу попытаться реализовать эту оболочку массива?


person Jason    schedule 27.11.2016    source источник
comment
std::array оборачивает статический массив, поэтому его размер должен быть указан во время компиляции. std::vector — это массив, размер которого определяется динамически во время выполнения.   -  person Remy Lebeau    schedule 27.11.2016
comment
Весь смысл std::array, его главное отличие от std::vector, заключается в том, что его размер определяется во время компиляции и, таким образом, не требует динамического выделения памяти. Если вы настаиваете на обертывании std::array, ваша обертка должна иметь такое же свойство, в противном случае это в значительной степени лишило бы смысла.   -  person Igor Tandetnik    schedule 27.11.2016
comment
Стандартные контейнеры уже спроектированы так, чтобы быть максимально взаимозаменяемыми. Возможно, вы потратите больше времени на изучение того, какие универсальные функции доступны для переноса кода контейнера между контейнерами. Если это невозможно с использованием функций текущей стандартной библиотеки, скорее всего, это невозможно.   -  person Galik    schedule 27.11.2016
comment
alloca и его варианты нестандартны, и их следует избегать, если это вообще возможно, но их можно обернуть аналогичным образом. Он доступен в большинстве компиляторов, но НЕ является стандартным C++.   -  person doug    schedule 27.11.2016


Ответы (1)


Я бы предпочел, чтобы размер указывался пользователем с помощью настройки конструктора, аналогичной вектору (например, MyArrayClass myArray(10) ). Как я могу попытаться реализовать эту оболочку массива?

Назначение std::array, в отличие от std::vector, заключается в том, что размер указывается во время компиляции. Его базовая структура представляет собой простой ванильный массив, размер которого требуется во время компиляции.

Я могу придумать следующую оболочку на случай, если она будет полезна

template <typename T, std::size_t N>
class Array {
  public:
    // stuff
  private:
    std::array<T, N> array_;
};
person Arun    schedule 27.11.2016