_Ty pop(){
if( base::empty()) throw exception;
_Ty val = base::top();
base::pop();
return val;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
template<
class _Ty,
class _Predicate = Less<_Ty>,
class _Container = Array<_Ty>
class _Policy = PriorityQueuePolicy<_Ty, _Predicate, _Container >
>
class PriorityQueue : public _Policy {};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Thanks
> Please write me what do you think about this :
> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> // 1) first class is similar to std::priority_queue
> // common interface like std::priority_queue
> void push(const _Ty& val);
> _Ty& top();
> void pop();};
That interface allows to make those functions strongly exception-safe.
> // 2) this class has only pop and push
> void push(const _Ty& val){
> _Ty pop(){
> if( base::empty()) throw exception;
> _Ty val = base::top();
> base::pop();
> return val;
> }};
That interface cannot be made strongly exception-safe because
base::pop() changes the state of the container before the top object
is handed over to the caller.
Then, if the copy constructor of _Ty throws during 'return val;' the
top object is lost. Herb Sutter's book Exceptional C++ and many other
sources cover this. Here is one:
http://www.boost.org/community/exception_safety.html
Ali
P.S. Any name that begins with an underscore followed by a capital
letter is reserved. Ty_ would be a better name.