|
Программирование >> Оптимизация возвращаемого значения
operator->() get () const; const; Т* release{) void reset (T *p = 0) , Cm. правило 28. Вернуть значение текущего обычного указателя. Отказаться от обладания текущим обычным указателем и вернуть его значение. Удалить указатель, считая, что обладаем р. Сделать все классы auto ptr дружественными. private: Т *pointee; template<class U> friend class auto ptr<U>; }; template<class T> inline auto ptr<T>: :auto ptr(T *p) : pointee(p) template<class T> inline auto ptr<T>::auto ptr(auto ptr<U>& rhs) : pointee(rhs.release 0) template<class T> inline auto ptr<T>::~auto ptr () { delete pointee; } template<class T> template<class U> inline auto ptr<T>& auto ptr<T>::operator=(auto ptr<U>& rhs) if (this != Scrhs) return *this; reset(rhs.release()); template<class T> inline TSc auto ptr<T>: { return *pointee; } template<class T> inline T* auto ptr<T>: { return pointee; } template<class T> inline T* auto ptr<T>: { return pointee; } template<class T> inline T* auto ptr<T>: { T *oldPointee = pointee; pointee = 0; return oldPointee; template<class T> inline void auto ptr<T>: : reset (T :operator*{) const :operator->() const :get{) const :release{) Реализация шаблона auto ptr : if (pointee != р) { delete pointee; pointee = p; A вот вариант auto ptr, в котором все функции реализованы в определении класса: template<class Т> class auto ptr { public: explicit auto ptr(T *p = 0) : pointee(p) {} template<class U> auto ptr(auto ptr<U>& rhs): pointee(rhs.release()) {} ~auto ptr() { delete pointee; } template<class U> auto ptr<T>& operator=(auto ptr<U>& rhs) { if (this != &rhs) reset(rhs.release()); return *this; TSc operator* 0 const { return *pointee; } T* operator->() const { return pointee; } T* get() const { return pointee; } T* release 0 { T *oldPointee = pointee; pointee = 0; return oldPointee; void reset (T *p = 0) { if (pointee ! = p) { delete pointee; pointee = p; } private: T *pointee; template<class U> friend class auto ptr<U>; }; Если ваши компиляторы еще не поддерживают директиву explicit, вы можете определить ее при помощи директивы #def ine: #define explicit Это нисколько не уменьшит функциональности шаблона auto ptr, но сделает его чуть менее безопасным (подробнее об этом сказано в правиле 5). Если ваши компиляторы не поддерживают шаблоны функций-членов, вы можете использовать не входящие в шаблон auto ptr конструктор копирования и оператор присваивания, описанные в правиле 29. Из-за этого шаблон auto ptr станет менее удобным для применения, но, увы, не существует способа приблизиться к поведению шаблонов функций-членов. Если шаблоны функций-членов (или другие возможности языка) важны для вас, сообщите об этом производителям программного обеспечения. Чем больше покупателей будут требовать введения новых возможностей языка, тем скорее они будут реализованы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |