Программирование >>  Оптимизация возвращаемого значения 

1 ... 90 91 92 [ 93 ] 94 95 96


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 станет менее удобным для применения, но, увы, не существует способа приблизиться к поведению шаблонов функций-членов. Если шаблоны функций-членов (или другие возможности языка) важны для вас, сообщите об этом производителям программного обеспечения. Чем больше покупателей будут требовать введения новых возможностей языка, тем скорее они будут реализованы.



1 ... 90 91 92 [ 93 ] 94 95 96

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика