La historia comienza con algo que creí muy simple:Contenedor inmutable con contenido mutable
Necesito diseñar una clase que use algunos contenedores STL. Necesito dar acceso a los usuarios de la clase a una versión inmutable de esos contenedores. No quiero que los usuarios puedan cambiar el contenedor (no pueden push_back()
en una lista, por ejemplo), pero quiero que los usuarios puedan cambiar los objetos contenidos (obtenga un elemento con back()
y modifíquelo) :
class Foo
{
public:
// [...]
ImmutableListWithMutableElementsType getImmutableListWithMutableElements();
// [...]
};
// [...]
myList = foo.getImmutableListWithMutableElements();
myElement = myList.back();
myElement.change(42); // OK
// [...]
// myList.push_back(myOtherElement); // Not possible
a primera vista, parece que un contenedor const va a hacer. Pero, por supuesto, sólo se puede utilizar un iterador const en un recipiente const y no se puede cambiar el contenido.
en una segunda mirada, cosas como especializada de contenedores o iterador vienen a la mente. Probablemente termine con eso.
Entonces, mi pensamiento es "Alguien tiene que haber hecho ya!" o "¡Debe existir una solución elegante y genérica!" y estoy aquí haciendo mi primera pregunta sobre SO:
¿Cómo se diseña/transformar un contenedor estándar en un recipiente con el contenido inmutable mutable?
estoy trabajando en ello, pero me siento como si alguien le acaba de decir "Hey, yo que cada vez, es fácil, mira!", Por lo que pido ...
Gracias por cualquier insinuación, sugerencias o maravillosas formas genéricas para hacer eso :)
EDIT:
Después de algunos experimentos, que terminó con contenedores estándar que manejan algunos punteros inteligentes decoradas específicamente. Está cerca de la respuesta de Nikolai.
La idea de un contenedor de elementos inmutables mutables no es un concepto matar, ver las notas interesantes en respuesta Oli.
La idea de un iterador específica es correcto, por supuesto, pero no parece práctico, ya que necesito para adaptarse a cualquier tipo de contenedor.
Gracias a todos por su ayuda.
Sí, pero para obtener un contenedor inmutable, tengo que devolver un contenedor de const, y luego obtendré elementos de const de él, ¿no? ¿Sugiere usar const_cast? Por supuesto que es una posibilidad, pero será un dolor usar ... ¿o me perdí algo? – neuro
Los punteros en el contenedor 'const' serán' const', pero no los objetos a los que apuntan. –
sí, tienes razón, por supuesto. Lo único es que no es tan genérico como pensé que podría ser. Como parte de un marco, me gustaría dar la posibilidad a los desarrolladores de framework de usar cualquier tipo de contenedor. Pero usar un contenedor de puntero o un contenedor de puntero inteligente debería hacer el trabajo ... – neuro