Supposons que j'écrive un enqueue()
qui prend en compte un unique_ptr
mais je ne veux en revendiquer la propriété que lorsque enqueue renvoie un succès. Si la file d'attente est pleine, je veux laisser l'élément unique_ptr
intacte (l'utilisateur peut réessayer plus tard avec le même élément)
bool enqueue(std::unique_ptr&& item){
if(!vector.full()){
vector.emplace(std::move(item));
return true;
}
return false;
}
// usage
auto item_ptr = make_unique<>();
while(!enqueue(std::move(item_ptr))){
// item_ptr is not moved
}
Je peux également définir la fonction de manière à ce qu'elle prenne une référence à une valeur lvalue à la place
bool enqueue(std::unique_ptr& item)
while(!enqueue(item_ptr)){
// item_ptr is not moved
}
Je ne sais pas lequel choisir, ils me semblent tous un peu anti-motifs, car habituellement, ils ne sont pas très bien conçus, et je ne sais pas si j'ai envie de les choisir. std::move
indique la suppression d'un unique_ptr (la plupart du temps, je travaille avec une fonction qui prend unique_ptr
par valeur), peut-être existe-t-il une meilleure solution ?