对于这个简单的循环队列,我想支持C ++ 11的移动语义,因此如果不需要,push()不会产生内存副本。
Circular<struct r, 1024> queue_;
queue_.push( { r0, r1 } );
但是我担心我的实现,特别是下面的第二个推送(),是不必要的或太冗长。
template<typename T, size_t capacity>
class Circular
{
public:
Circular()
: have_(capacity)
, w_(0)
, r_(0)
{}
~Circular() {}
void push( const T& x ) { have_[ w_++ % capacity ] = x; }
void push( T&& x ) { have_[ w_++ % capacity ] = x; }
...
protected:
std::vector<T> have_;
size_t w_;
size_t r_;
};
有没有更好的方法来获得这些语义? (编辑:事实上实现了预期的语义吗?)
跟进:我们可以避免重复push()方法的主体,同时保留预期的行为吗?
答案 0 :(得分:3)
确实有一种更好的方法可以获得这些语义:事实上,有一种方法可以实际获取这些语义,而代码目前却没有。 : - )
接受push
的右值引用是等式的一半,但在该函数中它再次成为左值表达式,因此您需要将std::move
添加到&#34;通过rvalue reference&#34;。
void push( T&& x ) { have_[ w_++ % capacity ] = std::move(x); }
除此之外,我无法想到要做出的任何具体改进。