C++ 带参数的新类数组
c++ new class array with parameter
参考 https://github.com/cameron314/readerwriterqueue,有一个示例代码如下:
ReaderWriterQueue<int> q(100); // Reserve space for at least 100 elements up front
q.enqueue(17); // Will allocate memory if the queue is full
bool succeeded = q.try_enqueue(18); // Will only succeed if the queue has an empty slot (never allocates)
assert(succeeded);
int number;
succeeded = q.try_dequeue(number); // Returns false if the queue was empty
assert(succeeded && number == 17);
// You can also peek at the front item of the queue (consumer only)
int* front = q.peek();
assert(*front == 18);
succeeded = q.try_dequeue(number);
assert(succeeded && number == 18);
front = q.peek();
assert(front == nullptr); // Returns nullptr if the queue was empty
假设我喜欢用参数 100 构造一个用于 ReaderWriterQueue 的数组,我该如何定义 var ?!
ReaderWriterQueue<int> qp[1024] ;
没关系,但我喜欢所有 1024 个参数为 100 的参数,
ReaderWriterQueue<int>(100) qp[1024] ;
不会编译,我尽量用指针:
ReaderWriterQueue<int>* qptr;
qptr = new ReaderWriterQueue<int>(1024) ;
将工作,但没有参数 100 ,
qptr = new ReaderWriterQueue<int>(100) (1024) ;
不会编译,那么我怎么能制作一个 1024 的 ReaderWriterQueue 数组,它们都是用参数 100 构造
由于ReaderWriterQueue
既不可复制/可移动,因此您可以使用static_vector
from http://en.cppreference.com/w/cpp/types/aligned_storage
template<class T, std::size_t N>
class static_vector
{
// properly aligned uninitialized storage for N T's
typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];
std::size_t m_size = 0;
public:
// Create an object in aligned storage
template<typename ...Args> void emplace_back(Args&&... args)
{
if( m_size >= N ) // possible error handling
throw std::bad_alloc{};
new (data + m_size) T(std::forward<Args>(args)...);
++m_size;
}
// Access an object in aligned storage
const T& operator[](std::size_t pos) const
{
return *reinterpret_cast<const T*>(data + pos);
}
// Delete objects from aligned storage
~static_vector()
{
for (std::size_t pos = 0; pos < m_size; ++pos) {
reinterpret_cast<const T*>(data+pos)->~T();
}
}
};
然后使用它
static_vector<ReaderWriterQueue<int>, 1024> queues;
for (int i = 0; i != 1024; ++i) {
queues.emplace_back(100)
}
使用 vector
执行此操作是微不足道的:
std::vector<ReaderWriterQueue<int>> qp(1024, ReaderWriterQueue<int>(100));
这当然假设ReaderWriterQueue
有一个(公共(复制构造函数,它可以做正确的事情。但是,在当前版本的ReaderWriterQueue
中并非如此,因此您尝试执行的操作是不可能的。
如果你真的想使用数组,你可以使用 std::fill
来填充它的元素,如下所示:
ReaderWriterQueue<int> qp[1024];
std::fill(begin(qp), end(qp), ReaderWriterQueue<int>(100));
正如评论中指出的那样,如果ReaderWriterQueue
是可复制的,这将起作用,而这似乎不是。然后,另一种解决方案是声明(智能(指针的数组或向量,如下所示ReaderWriterQueue
,并在以后对其进行初始化:
std::vector<std::shared_ptr<ReaderWriterQueue<int>>> qp(1024);
for(auto& x : qp)
x = make_shared<ReaderWriterQueue<int>>(100);
相关文章:
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 类数组插入函数
- C++访问指向结构的指针中的类数组指针
- 类数组正在损坏数据
- 如何在 turbo C++ 中增加类数组的大小?
- 如何初始化文件中的文本并将其传递给类数组,以便在c++中输出
- 从基类数组调用派生函数
- 具有构造函数的新对象数组,需要在C++中设置参数
- lower_bound结构节点的类数组中
- 在构造函数中使用参数创建一个类数组
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 如何将字符串片段读入类数组C++
- 如果类数组中的向量是动态push_backed的,内存如何工作
- 分割故障 - 遇到问题,创建新的数组实例
- C 类数组的Kotlin等效
- 指针算术,带有指向类数组的指针
- C++ Sytanx 关于类数组和新运算符的使用
- C++ 带参数的新类数组
- 指向类对象的新指针数组