Cla*_*are 0 c++ arrays templates
我想要一个围绕数组的包装器,例如,它将被存储在堆栈中 - 不关心内存释放 - 可以通过大括号列表进行初始化,并且可以在普通数组的任何位置进行替换.然后,我生成了以下代码.现在我想知道,我错过了什么. - 那么 - 这就是我想要的吗?
template<class T, size_t size>
struct Array
{
T body[size];
operator T* () { return body; }
};
Run Code Online (Sandbox Code Playgroud)
编辑:
我可能不精确.包装仅用于结构目的.当它处于初始化列表(主要是)时,它将用于从大括号列表构造数组.喜欢
class A {
protected: A(int array[])
...
class B : public A {
public: B() :
A( (Array<int, 2>) {{ 1, 2 }} )
...
Run Code Online (Sandbox Code Playgroud)
有一个const铸造操作员版本的提议. - 我一直在考虑这个问题,但我不确定,是不是真的需要.虽然const T[]通过现有的运算符隐式地进行转换,并且可以通过给定来定义常量数组T = const ...,但还有原因吗?
对于一个基本的例子,我认为你可以改进很多,除了一些辅助函数.特别是,有一个返回大小的方法会很好:
constexpr std::size_t size() const { return size; }
Run Code Online (Sandbox Code Playgroud)
此外,还有一些其他:
const/非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]; }
Run Code Online (Sandbox Code Playgroud)begin()和end()序列发生器(非常有用,例如基于C++ 11范围):
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(); }
Run Code Online (Sandbox Code Playgroud)一个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..
Run Code Online (Sandbox Code Playgroud)拥有一个构造函数,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);
}
...
};
Run Code Online (Sandbox Code Playgroud)
这是@DyP建议的另一个(初始化列表总是复制,完美转发尝试避免这种情况):
template <typename T, std::size_t N>
struct Array
{
...
template <typename... Args>
// possibly constexpr
Array(Args&&... args) : body{ std::forward<Args>(args)... }
{}
...
};
Run Code Online (Sandbox Code Playgroud)如果您想看到它,可以使用以下程序 - http://ideone.com/Zs27it#view_edit_box
您可以包含其他功能,但正如我所说,这是一个基本示例,您最有可能更好地使用std::array具有或多或少相同方法的东西.