Подтвердить что ты не робот

Сожительство boost:: shared_ptr и std:: shared_ptr

Я хочу использовать boost::log в какой-то момент, но я не могу передать std::shared_ptr в качестве параметра, потому что компилятор (VS2010) не может преобразовать его в boost::shared_ptr.

Мне действительно не нравится тот факт, что они являются инопланетянами друг другу.

Есть ли безопасный и прозрачный способ конвертировать один в другой, чтобы они не спотыкались друг с другом?

Я не думаю, что это дубликат этого вопроса, который утверждает, что оба они одинаковы.

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

template<typename T>
boost::shared_ptr<T> make_shared_ptr(std::shared_ptr<T>& ptr)
{
    return boost::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}

template<typename T>
std::shared_ptr<T> make_shared_ptr(boost::shared_ptr<T>& ptr)
{
    return std::shared_ptr<T>(ptr.get(), [ptr](T*) mutable {ptr.reset();});
}

EDIT: Обратите внимание, что это не работает со слабыми ссылками на исходный ptr. Поэтому будьте осторожны с ними!