C++ 带参数的新类数组

c++ new class array with parameter

本文关键字:新类 数组 参数 C++      更新时间:2023-10-16

参考 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);