...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
As you write more lambda functions, you'll notice certain patterns that you wish to refactor as reusable functions. When you reach that point, you'll wish that ordinary functions can co-exist with phoenix functions. Unfortunately, the immediate nature of plain C++ functions make them incompatible.
Lazy functions are your friends. The library provides a facility to make
lazy functions. The code below is a rewrite of the is_odd
function using the facility:
struct is_odd_impl { typedef bool result_type; template <typename Arg> bool operator()(Arg arg1) const { return arg1 % 2 == 1; } }; function<is_odd_impl> is_odd;
is_odd_impl
implements
the function.
is_odd
, an instance of
function<is_odd_impl>
,
is the lazy function.
Now, is_odd
is a truly lazy
function that we can use in conjunction with the rest of phoenix. Example:
std::find_if(c.begin(), c.end(), is_odd(arg1));
(See function.cpp)
The library is chock full of STL savvy, predefined lazy functions covering the whole of the STL containers, iterators and algorithms. For example, there are lazy versions of container related operations such as assign, at, back, begin, pop_back, pop_front, push_back, push_front, etc. (See STL).