unique_ptr boost эквивалент?

Есть ли какой-то эквивалентный class для std :: unique_ptr C ++ 1x в библиотеках boost? Поведение, которое я ищу, – это иметь безопасную фабричную функцию, например …

std::unique_ptr create_base() { return std::unique_ptr(new Derived); } void some_other_function() { std::unique_ptr b = create_base(); // Do some stuff with b that may or may not throw an exception... // Now b is destructed automagically. } 

EDIT: Прямо сейчас, я использую этот хак, который кажется лучшим, что я могу получить в этот момент …

 Base* create_base() { return new Derived; } void some_other_function() { boost::scoped_ptr b = create_base(); // Do some stuff with b that may or may not throw an exception... // Now b is deleted automagically. } 

Невозможно создать нечто вроде unique_ptr без C ++ 0x (где это часть стандартной библиотеки, и поэтому Boost не нужно ее предоставлять).

В частности, без ссылок на rvalue, которые являются признаками в C ++ 0x, надежная реализация unique_ptr невозможна с Boost или без нее.

В C ++ 03 существует несколько возможных альтернатив, хотя у каждого есть свои недостатки.

  • boost::shared_ptr , вероятно, является самой простой заменой с точки зрения возможностей. Вы можете безопасно использовать его везде, где вы в противном случае использовали бы unique_ptr и он сработает. Это было бы не так эффективно, потому что добавленный подсчет ссылок. Но если вы ищете простую замену, которая сможет обрабатывать все, что может сделать unique_ptr , это, вероятно, лучший выбор. (Конечно, shared_ptr может делать намного больше, но его также можно просто использовать как замену для unique_ptr .)
  • boost::scoped_ptr похож на unique_ptr но не позволяет передавать права собственности. Он отлично работает, пока умный указатель предназначен для сохранения исключительной собственности на протяжении всей своей жизни.
  • std::auto_ptr работает очень похоже на unique_ptr , но имеет несколько ограничений, в основном, что он не может быть сохранен в стандартных библиотечных контейнерах. Если вы просто ищете указатель, который позволяет передавать права собственности, но который не предназначен для хранения в контейнерах или скопирован, это, вероятно, хорошая ставка.

Начиная с версии Boost 1.57, существует официальная реализация unique_ptr в библиотеке Boost.Move .

Из документации :

(…) замену для std :: unique_ptr, которую можно использовать также из компиляторов C ++ 03.

Код доступен в файле заголовка и живет в пространстве имен boost::movelib . Кроме того, библиотека Boost.Move предоставляет make_unique() функцию make_unique() в , также в пространстве имен boost::movelib .

Следовательно, пример из вопроса может быть реализован следующим образом:

 #include  using boost::movelib::unique_ptr; unique_ptr create_base() { return unique_ptr(new Derived); } 

См. Живой пример в Wandbox . Обратите внимание, что код компилируется с gcc 4.6.4 в режиме C ++ 98 (!).

Что интересно в boost::movelib::unique_ptr когда применяется к вашему делу с базовыми / производными classами, реализация обеспечивает проверку времени компиляции для объявления виртуального деструктора в базовом classе. Если вы случайно его пропустили, код не будет компилироваться (нажмите кнопку «Выполнить (…)», чтобы увидеть сообщение об ошибке компилятора).

Одна из незначительных проблем заключается в том, что они includeся из каталога boost/move но код живет в пространстве имен boost::movelib (тонкая разница, но может раздражать).

См. Также stream в списке рассылки для более подробной информации.

Благодаря Ion Gaztañaga за этот абсолютно уникальный и полезный fragment кода.

Возможно, вы захотите попробовать «доказательство концепции» unique_ptr<> Howard Hinnant для C ++ 03 (отказ от ответственности – я этого не сделал):

Один из его примеров возвращает unique_ptr :

 unique_ptr factory(int i) { return unique_ptr(new int(i)); } 

Как насчет unique_ptr из библиотеки interprocess ?

Я использовал уникальную версию Howard Hinnant . Если вы не очень хорошо читаете сумасшедшие ошибки метапрограммирования из своего компилятора, вы можете захотеть четко понять. Однако он действует как уникальный_ptr в 90% случаев.

В противном случае я бы предложил передать параметры как boost::scoped_ptr& и обмениваться внутри, чтобы украсть собственность. Чтобы получить возвращаемые значения стиля unique_ptr, используйте auto_ptr . Захватите возвращаемое значение auto_ptr в shared_ptr или scoped_ptr чтобы избежать использования auto_ptr напрямую.

  • Поиск необработанного указателя для наборов unique_ptrs
  • Форвардная декларация с уникальным_ptr?
  • Является ли std :: unique_ptr необходимым для определения полного определения T?
  • Вызов конструктора initializer_list через make_unique / make_shared
  • Различия между unique_ptr и shared_ptr
  • Как использовать unique_ptr для pimpl?
  • Ну, как работает пользовательское деблокирование std :: unique_ptr?
  • std :: unique_ptr с неполным типом не будет компилироваться
  • Как использовать пользовательский удаленный элемент с элементом std :: unique_ptr?
  • Interesting Posts

    Что означают устройства ALSA, такие как «hw: 0,0»? Как я могу определить, что использовать?

    Диапазоны IP-адресов для серверов APNS?

    Подключение 2 внешних мониторов к ноутбуку?

    Как загрузить внешнюю веб-страницу внутри WebView

    Является ли оператор monad bind (>> =) ближе к функциональному составу (цепочке) или приложению функции?

    Лайтбокс Windows 7 UAC медленно появляется – может ли он ускоряться?

    OpenCv с Android-студией 1.3+ с использованием новой функции gradle – undefined reference

    Разница между расширением LifecycleActivity, Activity, ActionbarActivity и AppCompactActivity?

    eventlisteners, использующие hibernate 4.0 с весной 3.1.0.release?

    Изменение новой страницы вкладки Chrome в локальном файле

    Удаление вируса криптолокатора

    Макрос __FILE__ показывает полный путь

    ANDROID: идентификатор электронной почты для почтового клиента электронной почты пуст в android-parse

    Является ли использование && короткого замыкания безопасным в .NET?

    Как удалить фокус, не устанавливая фокус на другой элемент управления?

    Давайте будем гением компьютера.