我编写了一个自定义数组容器,就像大多数 C++ 库一样,包括std::array
and std::iterator
不适用于目标(嵌入)。模板类基本上按预期工作。
但是我没有设法设置一个构造函数,它可以初始化整个数组而不创建副本。我尝试了几种构造函数,包括通过引用传递。显示的将创建一个副本,如果传递的数组的大小与我的类的大小不匹配,则会出现问题。
该环境支持最高 C++11 的语言功能,但没有可用的 std 库。因此,答案类似的问题 https://stackoverflow.com/questions/26391745/custom-array-class-constructor-for-initialization-of-list无法使用。
模板类的源代码:
template<typename T, typename sizetype, sizetype SIZE>
class mArray
{
private:
T _elements[SIZE]; ///< Array of SIZE elements of Type T
static_assert( SIZE > 0, "Size must be > 0"); // Discourage empty array
public:
mArray(){};
mArray(T initArr[SIZE])
{
sizetype index = 0;
for (auto element : _elements)
{
_elements[index] = initArr[index]; //
++index;
}
}
T* begin()
{
return &_elements[0]; // Pointer to first _element
}
T* end()
{
return &_elements[SIZE]; // Pointer behind last _elements
}
T front()
{
return _elements[0]; // Return first element of _elements
}
T back()
{
return _elements[SIZE-1]; // Return last element of _elements
}
T at(sizetype pos)
{
static_assert( pos > SIZE, "pos must be < SIZE");
return _elements[pos];
}
T operator[](sizetype pos)
{
return _elements[pos];
}
T* data()
{
return *_elements;
}
sizetype size()
{
return SIZE;
}
};
如何改进构造函数以避免创建副本?
完成此操作的方式涉及聚合初始化。如果您尝试获取一个数组并从中进行复制,那当然需要副本。但是,如果您传递了一个初始值设定项列表,那么您只需要制作elements
公众并与std::array
syntax:
template<typename T, typename sizetype, sizetype SIZE>
class mArray {
public:
T elements_[SIZE];
static_assert( SIZE > 0, "Size must be > 0");
T operator[](sizetype pos) { // you sure about this?
return elements_[pos];
}
// other member functions
};
int main() {
mArray<int, std::size_t, 10> arr{{1, 3, 5, 7}};
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)