First patch to simplify <algorithm>

caj caj@cs.york.ac.uk
Sun Dec 5 15:09:00 GMT 2004


Gabriel Dos Reis wrote:

>caj <caj@cs.york.ac.uk> writes:
>
>| +  template<typename _ForwardIterator>
>| +    _ForwardIterator
>| +    adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
>| +    {
>| +      // concept requirements
>| +      __glibcxx_function_requires(_EqualityComparableConcept<
>| +	    typename iterator_traits<_ForwardIterator>::value_type>)
>| +      return adjacent_find(__first, __last,
>| +             __default_eq_pred<typename iterator_traits<_ForwardIterator>::
>| +			   value_type>());
>
>With the suggestions I made, the above simply reads
>
>         return std::adjacent_find(__first, __last, __gnu_cxx::equal());
>
>No, typename-fu. You can leave the "concept checking"  part to the
>"forwarded-to" more general algorithm.  And you should make the
>resulting function inline.
>(Note the explicit qualification, too.)
>
>  
>
It's definatly a thousand times nicer :) The only thing that I disagree 
with (probably because I don't know enough) is if you can still remove 
that concept requirement. I only left one concept requirement 
(EqualityComparable) and I don't think you are allowed to remove that, 
as the concept requirements in adjacent_find won't pick up directly that 
*__first isn't EqualityComparable (it will just check that 
__gnu__cxx::equal::operator() takes two parameters of type 
_ForwardIterator). Of course that particular concept requirement is not 
entirely needed anyway, because the code simply won't compile anyway if 
it isn't true, but I'm not sure if it can be removed....

Chris



More information about the Libstdc++ mailing list