|
Boost : |
From: shunsuke (pstade.mb_at_[hidden])
Date: 2008-01-12 16:49:35
Hi, all.
In a recent discussion, a library named Egg
possibly left a good impression on boosters, so I propose it.
Introduction:
It is not so easy to define FunctionObjects
especially if you want to support Boost.ResultOf and Boost.Lambda.
Therefore, as Boost provides iterator_facade and iterator adaptors,
Egg provides function_facade and function adaptors.
Egg provides the following features:
* Helpers to build FunctionObject:
* egg::function and egg::function_facade provides the way to
build FunctionObject which supports Boost.ResultOf and Lambda.
* FunctionObject Adaptors(in other words, higher-order functions):
* egg::curryN supports the currying.
* egg::pipable emulates extension methods(C#).
* egg::fuse emulates variadic templates in very limited way.
* etc...
The zipped source code is in Vault/FunctionObjects:
http://tinyurl.com/34lgda
The document is on line:
http://p-stade.sourceforge.net/boost/libs/egg/
svn repository:
https://p-stade.svn.sourceforge.net/svnroot/p-stade/trunk/boost
Tested under:
trunk and Boost1.34.1.
An example of currying in Egg:
int plus(int x, int y)
{
return x + y;
}
typedef result_of_curry2<int (*)(int, int)>::type T_curried_plus;
T_curried_plus const curried_plus = BOOST_EGG_CURRY2(&::plus);
void test()
{
BOOST_CHECK( curry2(&::plus)(4)(9) == 13 );
BOOST_CHECK( curried_plus(4)(9) == plus(4, 9) );
BOOST_CHECK( uncurry(curry2(plus))(4, 9) == 13 );
}
If interested enough, it might be enqueued to the review queue.
Anyway, comments are most welcome.
Regards,
-- Shunsuke Sogame
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk