c++数组包装器
C++ array wrapper
我想要一个数组的包装器,这样,它将存储在堆栈中-不关心内存释放-可以通过大括号列表初始化,并且可以在普通数组的任何位置替换。然后,我生成了以下代码。现在我在想,我是不是错过了什么。——那么——这是我想要的吗?
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
这样的内容,它们具有或多或少相同的方法。
- std::vector的包装器,使数组的结构看起来像结构的数组
- 通过Overloading Operator []访问自定义数组包装器中的元素
- std::在类包装器实例化时设置的数组大小
- 在C++中,为什么要重载"const char 数组"上的函数和包装"const char
- 使用 C++/CLI 包装器将 2D 数组从 C# 传递到非托管C++
- C++ DLL 包装器 vb.net 传递字节数组的字节数组?
- 将 C 对象的数组包装到类C++
- 如何为包装容器的模板类编写构造函数,其中容器可以是数组或向量
- 在匿名结构中包装灵活数组时,MSVC结构布局是否更改
- MATLAB LECACY_CODE工具 - 编写包装器功能以捕获数组
- 短数组的 JNI 包装器定义
- 在 Boost Python 中包装数组
- 如何在预先存在的3个标准压缩行/列数组上包装Eigen::SparseMatrix
- 为什么分配给AVX矢量包装类对象数组的元素会引发访问违规错误
- 使用BoostPython将C++数组包装成numpy数组
- 用std::类似向量的构造函数对C数组进行Constexpr包装
- 生成的静态数组的包装器宏
- c++数组包装器
- 使用 SWIG 将C++包装 <vector> 为 python NumPy 数组
- 如何使用智能指针包装数组