Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Максим Россия  
Дата: 29.10.21 14:38
Оценка:
Подскажите, пожалуйста, как shared_ptr осуществляет подобные преобразования

class BaseClass {
};

class DerivedClass : public BaseClass {
};

void pass_shared_ptr(std::shared_ptr<BaseClass> a) {
    std::cout << "ok" << std::endl;
}


В функцию можно передать и DerivedClass

std::shared_ptr<BaseClass> bc_sh_ptr(new BaseClass());
std::shared_ptr<DerivedClass> dc_sh_ptr(new DerivedClass());

pass_shared_ptr(bc_sh_ptr);
pass_shared_ptr(dc_sh_ptr);



По умолчанию это не должно работать, поскольку std::shared_ptr<BaseClass> и std::shared_ptr<DerivedClass> это разные типы. Вот это не работает

template <typename T> class MySharedPtr {
public:
    MySharedPtr(T *t) : t_{t} {}

private:
    T *t_;
};

void pass_my_ptr(MySharedPtr<BaseClass> a) {
    std::cout << "ok" << std::endl;
}


И такой вызов не разрешается

MySharedPtr<DerivedClass> dc_ptr(new DerivedClass());
pass_my_ptr(dc_ptr);
Errare humanum est
Re: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: reversecode google
Дата: 29.10.21 14:46
Оценка: -2
std::static_pointer_cast
std::dynamic_pointer_cast
изучите уже стандарт хотя бы поверхностно
Re[2]: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: qaz77  
Дата: 29.10.21 14:56
Оценка: 4 (1)
Здравствуйте, reversecode, Вы писали:

R>std::static_pointer_cast

R>std::dynamic_pointer_cast
R>изучите уже стандарт хотя бы поверхностно

Касты нужны для перехода от base к derived.
А для поддержки преобразования MyPtr<derived> к MyPtr<base> не делают явный каст.
Для этого используют шаблонный конструктор template<class U> MyPtr(const MyPtr<U>& other).
Если U* не преобразуется неявно в T*, то будет ошибка.

Кстати, MyPtr<T> в MyPtr<const T> по тому же принципу преобразуется.
Re: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: night beast СССР  
Дата: 29.10.21 14:58
Оценка: 4 (1)
Здравствуйте, Максим, Вы писали:

М>Подскажите, пожалуйста, как shared_ptr осуществляет подобные преобразования

М>По умолчанию это не должно работать, поскольку std::shared_ptr<BaseClass> и std::shared_ptr<DerivedClass> это разные типы. Вот это не работает

М>
М>template <typename T> class MySharedPtr {
М>public:
М>    MySharedPtr(T *t) : t_{t} {}

М>private:
М>    T *t_;
М>};

М>void pass_my_ptr(MySharedPtr<BaseClass> a) {
М>    std::cout << "ok" << std::endl;
М>}
М>


М>И такой вызов не разрешается


а если так:

template<typename Other>
MySharedPtr(const MySharedPtr<Other>& t, typename std::enable_if<std::is_base_of<T, Other>::value>::type* = nullptr);
Re[2]: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Максим Россия  
Дата: 29.10.21 14:59
Оценка:
R>std::static_pointer_cast
R>std::dynamic_pointer_cast
R>изучите уже стандарт хотя бы поверхностно

А что в таком тоне отвечаете? Опять кто-то обидел? Про эти функции я знаю. Вопрос был про то, как shared_pointer внутри производит автоматическое преобразование подобного рода.
Errare humanum est
Re[2]: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Максим Россия  
Дата: 29.10.21 15:08
Оценка:
NB>
NB>template<typename Other>
NB>MySharedPtr(const MySharedPtr<Other>& t, typename std::enable_if<std::is_base_of<T, Other>::value>::type* = nullptr);
NB>



qaz77, night beast — спасибо большое! Шаблонный конструктор это то, что нужно.
Errare humanum est
Re[3]: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Vzhyk2  
Дата: 12.11.21 06:32
Оценка:
М>А что в таком тоне отвечаете?
Спасибо, как в 90-е вернулся, молодость вспомнил. Типичное общение с группой гопников в те времена. Тебе осталось задать следующий вопрос: "А если найду?".
Re[2]: Конвертация MySharedPtr<BaseClass> в MySharedPtr<DerivedClass>
От: Ip Man Китай  
Дата: 20.11.21 07:00
Оценка:
Здравствуйте, reversecode, Вы писали:

R>std::static_pointer_cast

R>std::dynamic_pointer_cast
R>изучите уже стандарт хотя бы поверхностно

что-то ты дерзко разговариваешь. Зарплатой не хочешь помериться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.