On Wed, Jan 08, 2003 at 12:06:33PM -0500, David Abrahams wrote:
> Vladimir Prus <[EMAIL PROTECTED]> writes:
> 
> > David Abrahams wrote:
> >> Vladimir Prus <[EMAIL PROTECTED]> 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.

Is this approach feasible for boost? IIRC, somebody mentioned, that BCC does
not handle correctly const templace paramenters, and so, is_const<InputT> would
not work....

I would rather prefer one not-the-pretiest-but-working solution to one which
works only 90% of time without a possible workaround ...

What is the stretegy in Boost development?

Pavol
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to