Могу ли я иметь полиморфные контейнеры с семантикой значений в C ++ 11?

Это продолжение связанной публикации , в которой задавался вечный вопрос:

Могу ли я иметь полиморфные контейнеры с семантикой значений в 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

}

6
задан Community 23 May 2017 в 12:01
поделиться