Boost logo

Boost :

From: Pavol Droba (droba_at_[hidden])
Date: 2006-07-21 09:19:32


Sebastian Redl wrote:
> Pavol Droba wrote:
>
>> Now my comments to your patches:
>>
>> 1.) const Predicate& Pred
>> Although this change can bring a performance benefits, it has one big
>> drawback. You cannot pass an ordinary C function as predicate.
>> At least not in VC++ 7.1
>>
>>
> Would it be possible to use the argument_traits library to determine the
> most efficient way of passing the argument? Or would that destroy the
> deduction of template arguments?
>

Do you mean call_traits? As far as I know, they don't have special
support for function pointer. In addition, they cannot be
directly used on function templates. Any such a facility needs to
know the type of the argument beforehand, so it can be transformed
into result type. This is not a case in function templates.

The only generic way I'm aware of is the usage of enable_if. But this
would make the interface quite messy. Especialy when there is quite
a lot of functions which are affected.

Anyway, I think, I know a reasonable compromise. I will leave function
definitions as they are now, but internaly I will call them with boost::ref.

Example:
Now we have

template<typename SequenceT, typename PredicateT>
void trim_if(SequenceT Seq, PredicateT Pred);

and

template<typename SequenceT>
void trim(SequenceT Seq)
{
    trim_if(Seq, is_space());
}

I can change the second one to something like this:
trim_if(Seq, boost::ref(is_space()));

So it will go without copy penalty.

Is this reasonable enough?

Regards,
Pavol


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