Начиная с Boost 1.57 есть официальная реализация unique_ptr
в библиотеке Boost.Move .
Из документации :
(...) замена вставки для std :: unique_ptr, также используемая в C ++ 03
Составители.
Код доступен в заголовочном файле <boost/move/unique_ptr.hpp>
и находится в пространстве имен boost::movelib
. Кроме того, библиотека Boost.Move обеспечивает фабричную функцию make_unique()
в <boost/move/make_unique.hpp>
, а также в boost::movelib
пространстве имен.
Следовательно, пример из вопроса может быть реализован следующим образом:
#include <boost/move/unique_ptr.hpp>
using boost::movelib::unique_ptr;
unique_ptr<Base> create_base()
{
return unique_ptr<Base>(new Derived);
}
См. живой пример на Wandbox . Обратите внимание, что код прекрасно компилируется с gcc 4.6.4 в режиме C ++ 98 (!).
Что интересно в boost::movelib::unique_ptr
при применении к вашему случаю с базовыми / производными классами, реализация обеспечивает проверку во время компиляции для объявления виртуального деструктора в базовом классе. Если вы пропустите его , код не будет компилироваться (нажмите кнопку «Выполнить (...)», чтобы увидеть сообщение об ошибке компилятора).
Одной из незначительных проблем является то, что включает в себя поступление из каталога boost/move
, но код находится в пространстве имен boost::movelib
(небольшая разница, но может раздражать).
Подробнее см. в списке рассылки Boost .
Спасибо Иону Газтаньяге за этот абсолютно уникальный и полезный фрагмент кода.