----- Original Message ----- 
From: "Aleksey Gurtovoy" <[EMAIL PROTECTED]>

> 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));

This technique is adopted by Phoenix. With this, you can even do 
(as suggested by Joel Young):

        -  \         \
double  -  /\  f .   /\   x.  f(f x)
        - /  \      /  \

struct square_ {

    template <typename X>
    struct result { typedef X type; };

    template <typename X>
    X operator()(X x)
    {
        return x * x;
    }
};

function<square_> square;

template <typename F>
struct ffx {

    template <typename X>
    struct result { typedef X type; };

    ffx(F f_) : f(f_) {}

    template <typename X>
    X operator()(X x)
    {
        return f(f(x));
    }

    F f;
};

template <typename F>
function<ffx<F> >
doub(function<F> f)
{
    return function<ffx<F> >(f.op);
}

int
main()
{
    cout << doub(square)(5.0)() << endl;
    cout << doub(doub(square))(5.0)() << endl;
    cout << doub(doub(doub(square)))(5.0)() << endl;
    return 0;
}

Cheers,
Joel de Guzman
[EMAIL PROTECTED]
http://www.boost-consulting.com

PS> Jaakko and I are working on the LL/Phoenix merger.





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

Reply via email to