Questo è un sequel di un related post che ha chiesto l'eterna domanda:Posso avere contenitori polimorfici con la semantica del valore in C++ 11?
Posso avere contenitori polimorfi con semantica di valore in C++?
La domanda è stata posta in modo leggermente errato. Sarebbe dovuto essere più simile a:
Posso avere contenitori STL di un tipo di base memorizzato in base al valore in cui gli elementi mostrano un comportamento polimorfico?
Se si pone la domanda in termini di C++, la risposta è "no". Ad un certo punto, triterai gli oggetti memorizzati in base al valore.
Ora ripeto la domanda, ma rigorosamente in termini di C++ 11. Con le modifiche al linguaggio e alle librerie standard, è ora possibile memorizzare oggetti polimorfici in base al valore in un contenitore STL?
Sono ben consapevole della possibilità di memorizzare un puntatore intelligente per la classe base nel contenitore - questo non è quello che sto cercando per, come sto cercando di costruire oggetti nello stack senza utilizzando new
.
Considerate se si vuole (dal post linked) come base, C++ esempio:
#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 dovrebbe fare ciò che vuoi. –
Si noti che è possibile simulare la semantica del valore (almeno in termini di contenitori STL) con qualcosa come "boost :: ptr_container'. –
@ Martin: come osi battermi per 15 secondi?!? –