【问题标题】:How to create a std::array wrapper class如何创建 std::array 包装类
【发布时间】:2017-04-11 01:59:22
【问题描述】:

背景:

我正在尝试为 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 作为成员,这样我就可以在自己的 Vector 类中调用 std::vector 函数。

问题:

对于std::array,我必须在实例化任何对象时立即指定一个大小。因此,如果我像使用矢量类一样创建了一个成员变量,我将不得不为该数组对象指定一个大小。我宁愿用户使用与 Vector 类似的构造函数设置来指定大小(例如 MyArrayClass myArray(10) )。我该如何尝试实现这个 Array 包装器?

【问题讨论】:

  • std::array 包装了一个静态数组,因此必须在编译时指定其大小。 std::vector 是一个数组,其大小在运行时动态确定。
  • std::arraystd::vector 的主要区别在于它的大小是在编译时确定的,因此它不需要动态内存分配。如果您坚持包装std::array,您的包装器应该具有相同的属性,否则它将在很大程度上破坏这一点。
  • 标准容器已被设计为尽可能可互换。学习哪些通用函数可用于使容器代码在容器之间转移,您的时间可能会更好。如果无法使用当前的标准库函数,则很有可能是不可行的。
  • alloca 它的变体是非标准的,应尽可能避免,但可以类似地包装它。它在大多数编译器上都可用,但它不是标准 C++。

标签: c++ arrays c++11 stl stdarray


【解决方案1】:

我宁愿用户使用类似的方式指定尺寸 构造函数设置为 Vector 的(例如 MyArrayClass myArray(10) )。如何 我可以尝试实现这个 Array 包装器吗?

std::array 的目的与std::vector 不同,它的大小是在编译时指定的。它的底层结构是一个普通的普通数组,在编译时需要大小。

如果有用,我可以考虑以下包装器

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多