Esta es una secuela de un related post la que hizo la pregunta eterna:¿Puedo tener contenedores polimórficos con semántica de valores en C++ 11?
¿Puedo tener contenedores polimórficos con la semántica de valor en C++?
La pregunta se hizo de forma ligeramente incorrecta. Debería haber sido más como:
¿Puedo tener contenedores STL de un tipo básico almacenados por valor en el que los elementos muestran un comportamiento polimórfico?
Si realiza la pregunta en términos de C++, la respuesta es "no". En algún punto, cortará los objetos almacenados por valor.
Ahora hago la pregunta nuevamente, pero estrictamente en términos de C++ 11. Con los cambios en el lenguaje y las bibliotecas estándar, ¿ahora es posible almacenar objetos polimórficos por valor en un contenedor STL?
Soy muy consciente de la posibilidad de almacenar un puntero inteligente en la clase base en el contenedor - esto no es lo que estoy buscando, ya que estoy tratando de construir objetos en la pila sin usando new
.
cuenta si se quiere (del poste vinculados) tan básico C++ ejemplo:
#include <iostream>
using namespace std;
class Parent
{
public:
Parent() : parent_mem(1) {}
virtual void write() { cout << "Parent: " << parent_mem << endl; }
int parent_mem;
};
class Child : public Parent
{
public:
Child() : child_mem(2) { parent_mem = 2; }
void write() { cout << "Child: " << parent_mem << ", " << child_mem << endl; }
int child_mem;
};
int main(int, char**)
{
// I can have a polymorphic container with pointer semantics
vector<Parent*> pointerVec;
pointerVec.push_back(new Parent());
pointerVec.push_back(new Child());
pointerVec[0]->write();
pointerVec[1]->write();
// Output:
//
// Parent: 1
// Child: 2, 2
// But I can't do it with value semantics
vector<Parent> valueVec;
valueVec.push_back(Parent());
valueVec.push_back(Child()); // gets turned into a Parent object :(
valueVec[0].write();
valueVec[1].write();
// Output:
//
// Parent: 1
// Parent: 2
}
boost: ptr_vector debería hacer lo que quiera. –
Tenga en cuenta que puede simular la semántica de valores (al menos en términos de contenedores STL) con algo como 'boost :: ptr_container'. –
@Martin: ¿cómo te atreves a vencerme por 15 segundos?!? –