Boost logo

Boost :

From: Joel de Guzman (djowel_at_[hidden])
Date: 2003-01-24 21:57:26


----- Original Message -----
From: "David Abrahams" <dave_at_[hidden]>

> >> This is way too cool! Now we only need to provide such free-standing forms
> >> of all STL algorithms/member functions, and we will be living in a different
> >> world:
> >>
> >> std::vector<std::string> v;
> >>
> >> push_back(v, "text"); // plain call
> >> for_each(input, push_back(v, _1)); // currying
> >> for_each(v, for_each(_1, print_char)); // more currying
> >> // etc.!
> >>
> >> Breathtaking, IMO.
> >
> > That was my intent.
>
> I'd like you to take my breath, too, but I'm not as quick as Aleksey.
> I tried to compile your code but I couldn't come up with a plausible
> definition for function<...>. Could you fill in some details?

A good start is libs/phoenix/test/functors_tests.cpp
and libs/phoenix/example/fundamental/sample3.cpp
There are jamfiles in there FWIW.

Here's sample3.cpp:

#include <vector>
#include <algorithm>
#include <iostream>
#include "boost/phoenix/functions.hpp"
#include "boost/phoenix/primitives.hpp"

using namespace std;
using namespace phoenix;

struct is_odd_ {

    template <typename ArgT>
    struct result { typedef bool type; };

    template <typename ArgT>
    bool operator()(ArgT arg1) const
    { return arg1 % 2 == 1; }
};

function<is_odd_> is_odd;

int
main()
{
    int init[] = { 2, 10, 4, 5, 1, 6, 8, 3, 9, 7 };
    vector<int> c(init, init + 10);
    typedef vector<int>::iterator iterator;

    // Find the first odd number in container c
    iterator it = find_if(c.begin(), c.end(), is_odd(arg1));

    if (it != c.end())
        cout << *it; // if found, print the result
    return 0;
}

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


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