Вспомогательная функция C ++ 11 Pointer Uniquify - PullRequest
1 голос
/ 02 октября 2011

В C ++ 11 мне не хватает синтетического сахара для объединения указателя в std::unique_ptr. Поэтому я написал следующую вспомогательную функцию litte std::uniquify_ptr, обычно используемую для простого (не-конструктора) присваивания изменяемых членов класса (обычно это разные типы кэшей ).

#include <memory>

namespace std
{
    template<typename T>
    inline unique_ptr<T> uniquify_ptr(T* ptr)
    {
        return unique_ptr<T>(ptr);
    }
}

Я что-то упускаю с точки зрения безопасности здесь? Доступна ли уже подобная функция?

Ответы [ 3 ]

3 голосов
/ 02 октября 2011

Нет, аналогичная функция уже недоступна.Чем

auto ptr(std::uniquify_ptr(new T()));

лучше, чем

std::unique_ptr<T> ptr(new T());

?Т.е. почему должно существовать?Это не сильно спасет вас, если что-нибудь.

2 голосов
/ 02 октября 2011

unique_ptr<T> уже можно напрямую построить из T*, так что в этом нет особой необходимости.Такая заводская функция мало полезна, за исключением синтаксического сахара, например, auto x = make_unique<T>(...);.Кроме того, ваш move является избыточным.

0 голосов
/ 02 октября 2011

@ Шауб: я использую это для изменения значения существующего изменяемого std::unique_ptr члена класса.В этом случае

m_hashA = std::uniquify(new Hashes(cnt));

удобнее, чем

m_hashA = std::unique_ptr<Hashes>(new Hashes(cnt)));

, так как член объявлен как

mutable std::unique_ptr<Hashes> m_hashA; ///< Hash Table for Alternatives.

Спасибо

...