Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
prodenx
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 3
#1

Приведение типов умных указателей - C++

21.06.2016, 07:47. Просмотров 304. Ответов 7

Добрый день.

Реализовал простенький умный указатель с подсчетом ссылок.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
template<typename object_t>
class Ptr
{
public:
    typedef object_t object_type;
    
    Ptr();
    Ptr(object_t* object);
    Ptr(const Ptr<object_t>& other);
    ~Ptr();
    
    object_t* PeekPointer();
    
    Ptr<object_t>& operator=(const Ptr<object_t>& other);
    object_t& operator*() const;
    object_t* operator->() const;
    operator bool() const;
 
    template <typename T>
    operator Ptr<T>()
    {
        Ptr<T> res(dynamic_cast<T*>(m_ptr));
        delete res.m_refCounter;
        res.m_refCounter = m_refCounter;
        Ref();
        return res;
    }
 
private:
    template<typename any_t> friend class Ptr;
 
    inline void Ref();
    inline void Unref();
    
    object_t* m_ptr;
    uint32_t* m_refCounter;
};
Вопросы касаются оператора приведения типа template <typename T> operator Ptr<T>().
1. Как проверить, что текущий тип и тип преобразования находятся в одной иерархии наследования? А то динамикастит все подряд.
2. Есть ли более правильный способ приведения типов умного указателя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 07:47     Приведение типов умных указателей
Посмотрите здесь:

приведение типов указателей - C++
Задача у меня простая. Нужно побитно оперировать с числом unsigned int и на каких-то этапах заносить его в массив. для начала я решил,...

Отличие приведение типов указателей - C++
Чем отличаются при Base* a_ptr = new Derivered(); следующие строки: A) auto ptr = static_cast&lt;Derived*&gt;( a_ptr ); B) auto ptr =...

Использование умных указателей - C++
В каких случаях вы используете умные указатели, а в каких обычные?

Правильное использование умных указателей, как членов класса - C++
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее объявлять конструктор? Так? class Node...

Подскажите как переписать класс с использованием умных указателей, либо STL - C++
К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня... Сейчас пытаюсь восполнить этот пробел, но уже третий день не...

Приведение указателей - C++
Вопрос немного из другого раздела, но тем не менее, вопросы не по поводу WinApi, а поводу приведения указателей. В WinApi есть функция...

Приведение указателей - C++
В функции в качестве параметра передаю указатель на один из самых базовых классов . Затем в функции вызываю функцию, которой нет в базовом...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
21.06.2016, 07:59     Приведение типов умных указателей #2
Цитата Сообщение от prodenx Посмотреть сообщение
Как проверить, что текущий тип и тип преобразования находятся в одной иерархии наследования?
C++
1
static_assert(std::is_base_of<BaseClass, DerivedClass>::value, "Types is not combatible");
prodenx
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 3
21.06.2016, 08:42  [ТС]     Приведение типов умных указателей #3
А если без использования стандарта C++11?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
21.06.2016, 09:59     Приведение типов умных указателей #4
Цитата Сообщение от prodenx Посмотреть сообщение
А если без использования стандарта C++11?
С помощью boost, например. И лучше пользоваться конструктором для преобразования, больше контроля, чище код.
C++
1
2
3
4
5
6
7
8
9
10
template <typename P>
class Ptr
{
public:
    template <typename T>
    Ptr(Ptr<T> & other, typename boost::enable_if< boost::is_base_of<P, T> >::type * = 0)
        : m_ptr(other.m_ptr)
    { }
//....
};
Насчет dynamic_cast по умолчанию - очень спорное решение. По умолчанию должна поддерживаться естественная семантика преобразования указателей (Наследник -> База). А преобразование dynamic_cast лучше вынести в отдельную функцию, нечто вроде:
C++
1
2
template <typename T, typename P>
Ptr<T> dynamic_ptr_cast(Ptr<P> & x);
PS. Если буст использовать не хочется, то enable_if пишется легко руками, с is_base_of чуть сложнее, но не смертельно.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
21.06.2016, 11:11     Приведение типов умных указателей #5
Цитата Сообщение от DrOffset Посмотреть сообщение
с is_base_of чуть сложнее, но не смертельно.
Разве простой SFINAE'ки с ссылкой не достаточно?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
21.06.2016, 11:17     Приведение типов умных указателей #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Разве простой SFINAE'ки с ссылкой не достаточно?
Если ты про такое:
C++
1
2
3
4
    template <typename T>
    Ptr(typename boost::enable_if< boost::is_base_of<P, T>, Ptr<T> >::type & other)
        : m_ptr(other.m_ptr)
    { }
то нет. Заблокируешь вывод типа.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
21.06.2016, 11:20     Приведение типов умных указателей #7
Цитата Сообщение от DrOffset Посмотреть сообщение
то нет
Блин, даже не понял о чем Вы.
Оказывается, я прочитал не так.
то enable_if пишется легко руками, с is_base_of чуть сложнее
'с' пропустил, получилось, что is_base_of сложнее написать, чем enable_if

В мозгу получилось несоответствие моего вопроса и Вашего ответа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 11:19     Приведение типов умных указателей
Еще ссылки по теме:

Приведение указателей в стиле си - C++
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в c++ т.е вот например дан код: void* p = (int *)&amp;ip; и что...

Неявное приведение указателей на классы - C++
Всем привет! Обнаружилась вот такая нестыковочка: имеем интерфейсный класс IIn. И имеем класс-наследник ExtIn : public IIn далее...

Приведение типов - C++
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a = (float)123.4

Приведение типов - C++
В паскале можно привести типы: type ts = 0..9; chislo = array of ts; Как это сделать на С++?

Приведение типов - C++
В чем различие привидения типа (type)expression, от type(expression)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
prodenx
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 3
22.06.2016, 11:19  [ТС]     Приведение типов умных указателей #8
Спасибо всем за помощь, помогли
Yandex
Объявления
22.06.2016, 11:19     Приведение типов умных указателей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru