Implementar contenedores con punteros inteligentes

Ok, entonces todos saben que los punteros sin procesar deben evitarse como la peste y preferir los punteros inteligentes, pero ¿se aplica este consejo al implementar un contenedor? Esto es lo que estoy tratando de lograr:

template<typename T> class AVLTreeNode {
public:
    T data;
    unique_ptr<AVLTreeNode<T>> left, right;
    int height;
}

Unique_ptr puede hacer que las funciones de contenedor sean más engorrosas de escribir porque no puedo tener múltiples punteros sin formato que apunten temporalmente al mismo objeto de una manera elegante. Por ejemplo

unique_ptr<AVLTreeNode<T>> rotate_right(unique_ptr<AVLTreeNode<T>> n1)
{
    unique_ptr<AVLTreeNode<T>> n2 = n1->left;

    n1->left = n2->right;
    n2->right = n1;
    // n1 must now be referenced through the longer name n2->right from now on
    n2->right->recalculate_height();
    n2->recalculate_height();

    return n2;
}

(No es gran cosa en este ejemplo, pero puedo imaginar cómo podría convertirse en un problema). ¿Debo tomar problemas como estos como una fuerte pista de que los contenedores deben implementarse con una buenanew, delete, y punteros en bruto? Parece mucho problema simplemente evitar escribir un destructor.

Respuestas a la pregunta(5)

Su respuesta a la pregunta