컨테이너에 이들 타입 객체에 대한 포인터를 저장하는 프로그램은 다음과 같다.
// Ex3_06.cpp // 베이스 포인터를 저장하는 컨테이너에 파생 클래스 객체를 저장하는 예제 #include <iostream> // 표준 스트림 #include <memory> // 스마트 포인터 #include <vector> // 벡터 컨테이너 #include "Box.h" #include "Carton.h" using std::unique_ptr; using std::make_unique; int main() { std::vector<unique_ptr<Box>> boxes; boxes.push_back(make_unique<Box>(1, 2, 3)); boxes.push_back(make_unique<Carton>(1, 2, 3)); boxes.push_back(make_unique<Carton>(4, 5, 6)); boxes.push_back(make_unique<Box>(4, 5, 6)); for(auto&& ptr : boxes) std::cout << *ptr << " volume is " << ptr->volume() << std::endl; }
크게 설명이 필요한 코드는 아니다. vector는 std::unique_ptr<Box> 타입을 원소로 저장하므로 Box 객체에 대한 스마트 포인터를 저장하거나 Box를 기반 클래스로 하는 타입으로 만든 객체에 대한 스마트 포인터를 저장할 수 있다. boxes 컨테이너에는 push_back() 멤버를 호출해서 Box 객체와 Carton 객체에 대한 스마트 포인터를 저장한다. 여기서 push_back() 멤버는 우측값 참조 매개변수 버전이 호출된다. using 지시자를 사용해 코드의 가독성을 높였다. vector에 저장된 원소가 가리키는 각 객체의 상세 정보는 범위 기반 for 루프로 출력한다. for 루프에서 ptr로 추론되는 타입은 우측값이 된다.