Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-01-08 12:06:33


Vladimir Prus <ghost_at_[hidden]> writes:

> David Abrahams wrote:
>> Vladimir Prus <ghost_at_[hidden]> writes:
>
>>>I'd prefer the latter variant, so that non-broken platforms use more natural
>>>syntax. Another question is whether we could use only the second version.
>>>Theoretically, if you call the second version on const string, then InputT
>>>should be deduced as "const string". You can then write a simple wrapper to
>>>select const_iterator or iterator.
>>>
>>>The only problem is, IIRC, borland drops "const" on template arguments
>>>sometimes, and that's not possible to fix. Also, the "simple wrapper"
>>>requires partial specialization. So, I'm not sure this approach is
>>>viable, either.
>> There are mostly-transparent solutions. Something like:
>> // find_first sequence const version
>> template< typename InputT, typename SearchT >
>> inline iterator_range< typename InputT::const_iterator >
>> find_first_impl( const InputT& Input, const SearchT& Search, 0 )
>> {
>> ...
>> }
>
> I'm guessing the last parameter should be "int"?

No, sorry. It should be "..."

>> // find_first sequence non-const version
>> template< typename InputT, typename SearchT >
>> inline iterator_range< typename InputT::const_iterator >
>> find_first_impl( InputT& Input, const SearchT& Search, int )
>> {
>> ...
>> }
>> // find_first sequence
>> template< typename InputT, typename SearchT >
>> inline iterator_range< typename InputT::iterator >
>> find_first( InputT& Input, const SearchT& Search )
>> {
>> find_first_impl(Input, Search, 0);
>> }
>> Should work on vc6. Can't vouch for Borland, though :(
>
> Unfortunately, "first_first" will return the same plain (non-const) iterator
> in all cases. And we'd need to return const_iterator when string is const.

OK, let me fix that:

    // find_first sequence
    template< typename InputT, typename SearchT >
    inline iterator_range<
        typename mpl::if_<
             is_const<InputT>
             , typename InputT::const_iterator
             , typename InputT::iterator
>::type
>
    find_first( InputT& Input, const SearchT& Search )
    {
        find_first_impl(Input, Search, 0);
    }

Looking at the name of the function, it occurs to me that dispatching
to separate implementations might not be needed.

The only restriction on this one is that it doesn't work when the
Input parameter is an non-const rvalue.

-- 
                       David Abrahams
   dave_at_[hidden] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk