Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion]Is it possible to wrap a function template into a function object?
From: Joel de Guzman (joel_at_[hidden])
Date: 2011-08-11 21:15:21


On 8/11/2011 11:28 AM, someguy wrote:
> If there is a function template:
> template<typename T> T f(T t);
> then f is not a type and cannot be passed to fusion::for_each() as the
> second argument.
> But I can't write fusion::for_each(someSequence,&f<SomeType>) either since
> elements of someSequence has different types.
> While I can write f as a functor fo
> struct fo{ template<typename T> T operator()(T t); };
> and call fusion::for_each(someSequence,fo()), sometimes I need to use
> function templates in libraries ( say, I have a fusion::vector whose
> elements are ranges ) and the only solution seems to be writing a lot of
> functors to wrap the function templates. I tried to find a wrapper class
> template that can wrap arbitary function templates to functors in boost but
> I didn't find any. Then I tried to write such a wrapper using constructs
> like
> template&lt;template&lt;typename T0&gt; class F>struct temp_fun_1;
> but the code made my MSVC2008 compiler crash(really!). Is there such a
> wrapper in boost or any other library, or is it even possible?

fusion::for_each is easy because the expected function only needs to
return void. It gets more complex if you have to return something,
e.g. fusion::fold. You really need a Polymorphic Function Object
(http://tinyurl.com/3qpsrkc) with proper result_of facilities.
Anything less won't cut it.

Wrapper? There's nothing close to what you want primarily due to
the complexities of the return type deduction. It won't make sense
to provide an easy wrapper for monomorphic return types which is
only useful for for_each.

Regards,

-- 
Joel de Guzman
http://www.boostpro.com
http://boost-spirit.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net