David Abrahams wrote:
> Terje Slettebų <[EMAIL PROTECTED]> writes:
> > Perhaps it might be possible to do some compile-time/run-time lambda
> > (similar to Boost.Lambda for runtime, and MPL's lambda), so you 
> > could do something like:
> >
> > mpl::for_each<my_list>(my_function<_>(s));
> >
> > It would then transform the function call "my_function<_>(s)" into 
> > an instantiated function object of the kind suitable for 
> > mpl::for_each.
> 
> I'm afraid that particular syntax won't work for this particular case,
> though.  If my_function is a function template, my_function<_> is a
> function, and my_function<_>(s) calls that function.
> 
> Since there are no (function template) template parameters, only
> (class template) template parameters, there doesn't appear to be any
> way to make this one particularly easy except by using the
> preprocessor to define some kind of function object.
> 
> It appears to be just bad luck that higher order functional
> programming with function templates is impossible in C++.

My current understanding (which, admittedly, is not backed up by a
real-world experience) is that if you care about higher-orderness of your
generic algorithms, a preferred implementation construct for those
algorithms is not a function template, but a static _function object_ (a
technique used in FC++):

    struct my_function_
    {
        template< typename U >
        void operator()(std::string const& text, U)
        {
            // ...
        }

    } my_function; // here!


For ordinary uses, the above will act just like a plain function template
(minus ADL/explicit template arguments specification):

    my_function("text", int());

and it will also allow one to do something like this:

    std::string text("text");
    mpl::for_each< my_types >(boost::bind<void>(my_function, text, _1));


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

Reply via email to