为没有默认构造函数的类型初始化静态大小的数组
Initializing statically sized arrays for types without a default constructor
我正在编写一个简单的模板化循环缓冲区:
template <typename T, size_t N>
class CircularBuffer {
T _buf[N];
T *_data;
size_t _head;
size_t _count;
size_t _capacity;
CircularBuffer():
_data(nullptr),
_head(0),
_count(0),
_capacity(N) {}
protected:
T* buffer() {
if (_count <= N) return &_buf;
else return _data;
}
public:
T& operator[](size_t i) {
size_t j = i % _count;
j = (_head + j) % _capacity;
return buffer()[j];
}
T& push_back(const T& o) {
if (_count == _capacity) {
dynamically_allocate_data();
}
size_t j = (_head + _count++) % _capcity;
buffer()[j] = o;
}
T pop_front() {
size_t old_head = _head;
_head = (_head + 1) % _capacity;
return buffer()[old_head];
}
};
这是从真实事物中剥离出来的,但相距不远,您明白了。这避免了为少于 N
项的缓冲区分配内存。
问题是这对没有默认构造函数的 T
不起作用。我可以为 CircularBuffer
-- ala std::vector
's-- 提供一个构造函数,它接受一个 T
来填充空缓冲区,但我不确定如何在没有的情况下实际实现它仍然隐式调用 T
的(可能不存在的)默认构造函数。
类似问题的回复建议使用 std::vector
或在 void*
数组上放置 new,但在这种情况下不适用,因为重点是避免在内部循环中动态分配内存.
如何在没有默认构造函数的情况下为 T
构造此 class? (或者,是否有另一种方案可以避免在缓冲区中开始构建空白 T
?)
使用 std::optional
(或 boost::optional
如果您的编译器是 pre-17)怎么样?您可以将静态数组定义为 std::optional<T> _buf[N];
.
std::optional
类型支持放置构造(因此 T
不需要默认构造函数)并静态分配,所以这会满足您的要求,不是吗?
我正在编写一个简单的模板化循环缓冲区:
template <typename T, size_t N>
class CircularBuffer {
T _buf[N];
T *_data;
size_t _head;
size_t _count;
size_t _capacity;
CircularBuffer():
_data(nullptr),
_head(0),
_count(0),
_capacity(N) {}
protected:
T* buffer() {
if (_count <= N) return &_buf;
else return _data;
}
public:
T& operator[](size_t i) {
size_t j = i % _count;
j = (_head + j) % _capacity;
return buffer()[j];
}
T& push_back(const T& o) {
if (_count == _capacity) {
dynamically_allocate_data();
}
size_t j = (_head + _count++) % _capcity;
buffer()[j] = o;
}
T pop_front() {
size_t old_head = _head;
_head = (_head + 1) % _capacity;
return buffer()[old_head];
}
};
这是从真实事物中剥离出来的,但相距不远,您明白了。这避免了为少于 N
项的缓冲区分配内存。
问题是这对没有默认构造函数的 T
不起作用。我可以为 CircularBuffer
-- ala std::vector
's-- 提供一个构造函数,它接受一个 T
来填充空缓冲区,但我不确定如何在没有的情况下实际实现它仍然隐式调用 T
的(可能不存在的)默认构造函数。
类似问题的回复建议使用 std::vector
或在 void*
数组上放置 new,但在这种情况下不适用,因为重点是避免在内部循环中动态分配内存.
如何在没有默认构造函数的情况下为 T
构造此 class? (或者,是否有另一种方案可以避免在缓冲区中开始构建空白 T
?)
使用 std::optional
(或 boost::optional
如果您的编译器是 pre-17)怎么样?您可以将静态数组定义为 std::optional<T> _buf[N];
.
std::optional
类型支持放置构造(因此 T
不需要默认构造函数)并静态分配,所以这会满足您的要求,不是吗?