Понедельник, 25 Ноября 2024, 10:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вопрос по шаблонам и auto_ptr
vasua99Дата: Суббота, 21 Марта 2015, 13:10 | Сообщение # 1
GNU follower
Сейчас нет на сайте
Начал разбираться с умными указателями. Немного не совсем пойму, зачем в auto_ptr и auto_ptr_ref используются разные шаблонные типы. По идее же мы храним указатель одного типа. Почему бы что в auto_ptr_ref, что в auto_ptr не использовать один шаблонный тип. Т.е заместо:
Код

namespace std   
{
    template<class Y>   
    struct auto_ptr_ref {};

    template<class X>   
    class auto_ptr   
    {
    public:
      typedef X element_type;

      explicit auto_ptr(X* p = 0) throw();
      auto_ptr(auto_ptr&) throw();
      template<class Y> auto_ptr(auto_ptr<Y>&) throw();
      auto_ptr& operator=(auto_ptr&) throw();
      template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw();
      auto_ptr& operator=(auto_ptr_ref<X> r) throw();

      ~auto_ptr() throw();

      X& operator*() const throw();
      X* operator->() const throw();
      X* get() const throw();
      X* release() throw();
      void reset(X* p = 0) throw();

      auto_ptr(auto_ptr_ref<X>) throw();
      template<class Y> operator auto_ptr_ref<Y>() throw();
      template<class Y> operator auto_ptr<Y>() throw();
    };
}


так:
Код

namespace std   
{

    template<class X>   
    class auto_ptr   
    {
    public:
      template<class Y = X>
      struct auto_ptr_ref {}
      typedef X element_type;

      explicit auto_ptr(X* p = 0) throw();
      auto_ptr(auto_ptr&) throw();
      auto_ptr& operator=(auto_ptr&) throw();
      auto_ptr& operator=(auto_ptr_ref<> r) throw();

      ~auto_ptr() throw();

      X& operator*() const throw();
      X* operator->() const throw();
      X* get() const throw();
      X* release() throw();
      void reset(X* p = 0) throw();

      auto_ptr(auto_ptr_ref<>) throw();
      operator auto_ptr_ref<>() throw();
    };
}


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)

Сообщение отредактировал vasua99 - Суббота, 21 Марта 2015, 13:12
OpenGOOДата: Суббота, 21 Марта 2015, 15:56 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Написано почему, но на английском

Хотя кое что есть и по русски из той книги почему сделали и такой трюк.

Прочие члены класса auto_ptr (вспомогательный тип auto_ptr_ref и использующие его функции) реализуют довольно хитрые преобразования, позволяющие выполнять операции копирования и присваивания только с неконстантными экземплярами auto_ptr

По этой причине был введен класс auto_ptr_ref, обеспечивающий механизм преобразования в lvalue Работа этого механизма основана на различиях между перегрузкой (overloading) и правилах идентификации аргументов в шаблонах.

Это из другого источника
Назначение auto_ptr_ref -- обеспечить семантику разрушающего копирования, ввиду чего копирование константного auto_ptr становится невозможным.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
SaiteiДата: Суббота, 21 Марта 2015, 16:18 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата vasua99 ()
X* operator->() const throw();

извините что не по теме. Но что это? Это тоже самое, что и X* operator->() const {throw();} ?
XakepДата: Суббота, 21 Марта 2015, 16:48 | Сообщение # 4
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата Saitei ()
извините что не по теме. Но что это? Это тоже самое, что и X* operator->() const {throw();} ?

вроде нет, это функция
Цитата vasua99 ()
Начал разбираться с умными указателями. Немного не совсем пойму, зачем в auto_ptr и auto_ptr_ref используются разные шаблонные типы. По идее же мы храним указатель одного типа. Почему бы что в auto_ptr_ref, что в auto_ptr не использовать один шаблонный тип. Т.е заместо:

Забейте на auto_ptr, вместо них есть unique_ptr и shared_ptr, лучше про них почитай.
OpenGOOДата: Суббота, 21 Марта 2015, 23:13 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Из второго издания Язык программирования С++ (автор Бьерн Страуструп)

Цитата
Если функция не будет запускать никаких особых ситуаций, ее можно
описать, явно указав пустой список:

int g() throw (); // не запускает никаких особых ситуаций


Читайте книги, там много чего полезного еще сможете узнать.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг