1

キューのテンプレート クラスがあります。また、std::unique_ptr に含まれるオブジェクトを格納できるようにしたいと考えています。

std::unique ポインターは任意の型でインスタンス化できるため、通常のテンプレートの特殊化はできません。

キュー コードは次のようになります。

bool TQueue<T>::Push(const T& item)
{
  m_Mem[currTail] = item;
}

bool TQueue<T>::Pop( T& item )
{
  item = m_Mem[currHead];
} 

m_Mem[curtail] = std::move(item) を実行する必要がある場合に、std::unique_ptr タイプに対してもこれを機能させる方法

4

1 に答える 1

3

あなたは少し間違った角度から問題に取り組んでいます。をのmove()中に入れることはできませんPush()。手遅れです。外部にある必要があります-任意の引数のリソースを実際に盗むことはできません。ユーザーにコピー不可能なリソースを積極的にそこに移動するよう依頼する必要があります。したがって、単純に追加のオーバーロードを提供します。

bool TQueue<T>::Push(const T& item)
{
  m_Mem[currTail] = item;
}

bool TQueue<T>::Push(T&& item)
{
  m_Mem[currTail] = std::move(item);
}

そうすれば、ユーザーは必要に応じてオブジェクトをコンテナーに積極的に移動できます ( queue.Push(std::move(my_object));.

の場合Pop()、状況はさらに単純です。Pop()要素をキューから削除するため、常に削除する必要がmove()あります。コピーは保持されません。

bool TQueue<T>::Pop( T& item )
{
  item = std::move(m_Mem[currHead]);
} 
于 2013-11-12T07:44:02.357 に答える