|
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