std :: vector在数据结构中移动语义

时间:2015-07-02 10:54:00

标签: c++ c++11

对于这个简单的循环队列,我想支持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()方法的主体,同时保留预期的行为吗?

1 个答案:

答案 0 :(得分:3)

确实有一种更好的方法可以获得这些语义:事实上,有一种方法可以实际获取这些语义,而代码目前却没有。 : - )

接受push的右值引用是等式的一半,但在该函数中它再次成为左值表达式,因此您需要将std::move添加到&#34;通过rvalue reference&#34;。

void push( T&& x )    { have_[ w_++ % capacity ] = std::move(x); }

除此之外,我无法想到要做出的任何具体改进。