c++数组包装器

C++ array wrapper

本文关键字:包装 数组 c++      更新时间:2023-10-16

我想要一个数组的包装器,这样,它将存储在堆栈中-不关心内存释放-可以通过大括号列表初始化,并且可以在普通数组的任何位置替换。然后,我生成了以下代码。现在我在想,我是不是错过了什么。——那么——这是我想要的吗?

template<class T, size_t size>
struct Array
{
    T body[size];
    operator T* () { return body; }
};
编辑:

我可能不太精确。包装器仅用于构造目的。当处于初始化列表中时(主要),它将用于从大括号列表构造数组。像

class A {
    protected: A(int array[])
    ...
class B : public A {
    public: B() : 
        A( (Array<int, 2>) {{ 1, 2 }} )
        ...

有一个const版本的强制转换操作符的命题。-我一直在考虑这个,但我不确定,真的需要吗?虽然通过现有的操作符隐式地转换到const T[],并且可以通过给定T = const ...来定义常量数组,还有原因吗?

对于一个基本示例,我认为除了一些辅助函数之外,您没有太多可以改进的地方。特别是,最好有一个方法返回size:

constexpr std::size_t size() const { return size; }

此外,这里还有一些其他的:

  • const/non- const过载operator[N]:

    正如@ChristianRau在评论中所说,operator T*提供了一个- const版本。我们可以这样实现const版本:

    T const& operator [](std::size_t n) const
    {
        return body[n];
    }
    // similarly for non-const:
    T& operator [](std::size_t n) { return body[n]; }
    
  • begin()end()序列器(非常有用,例如对于c++ 11基于范围的for):

    T* begin() { return body; }
    T* end()   { return body + size; }
    // const versions... very much the same
    T const* cbegin() const { return body; }
    T const* cend()   const { return body + size; }
    T const* begin()  const { return cbegin(); }
    T const* end()    const { return cend(); }
    
  • 一个at()方法,它包括边界检查(与operator[]相反):

    T const& at(std::size_t offset) const
    {
        // You should do bounds checking here
        return body[offset];
    }
    // also a non-const version again..
    
  • 如果有一个接受std::initializer_list<T>的构造函数就更好了,这样你就不必使用聚合初始化了:

    #include <algorithm>
    #include <initializer_list>
    template <typename T, std::size_t N>
    struct Array
    {
        ...
        Array(std::initializer_list<T> const& list)
        {
            std::copy(list.begin(), list.end(), body);
        }
        ...
    };
    

    这是@DyP建议的另一个(初始化列表总是复制,完美转发试图避免这种情况):

    template <typename T, std::size_t N>
    struct Array
    {
        ...
        template <typename... Args>
        // possibly constexpr
        Array(Args&&... args) : body{ std::forward<Args>(args)... } 
        {}
        ...
    };
    

如果您想看的话,下面是正在运行的程序——http://ideone.com/Zs27it#view_edit_box

还可以包含其他功能,但正如我所说的,这是一个基本示例,您可能最好使用像 std::array 这样的内容,它们具有或多或少相同的方法。