Это продолжение связанной публикации , в которой задавался вечный вопрос:
Могу ли я иметь полиморфные контейнеры с семантикой значений в C ++?
Был задан вопрос немного неправильно. Это должно было быть больше похоже на:
Можно ли хранить контейнеры STL базового типа по значению, в которых элементы демонстрируют полиморфное поведение?
Если вы задаете вопрос в терминах C ++, ответ будет «нет» . " В какой-то момент вы будете нарезать объекты, хранящиеся по значению.
Теперь я снова задаю вопрос, но строго в терминах C ++ 11. Благодаря изменениям языка и стандартных библиотек, теперь возможно хранить полиморфные объекты по значению в контейнере STL?
Мне хорошо известно о возможности хранения интеллектуального указателя на базовый класс в контейнере - это не то, что я ищу , поскольку я пытаюсь создавать объекты на стек без использования new
.
Подумайте, будете ли вы (из связанного сообщения) в качестве базового примера C ++:
#include
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 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 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
}