
On Wed, Apr 13, 2011 at 5:35 PM, Dave Abrahams
At Wed, 13 Apr 2011 16:10:12 +0100, Robert Jones wrote:
I'm a newbie to Phoenix, just exploring, but I guess my intent in this code is obvious. Can anyone tell me what I'm doing wrong?
Thx
- Rob.
#include <iostream> #include
#include #include #include using namespace boost::phoenix; using namespace boost::phoenix::arg_names; using namespace std;
int main() { boost::function
factorial; factorial = if_else( _1 == 0, 1, _1 * factorial( _1 - 1 ) ); I think you'd better find a way to store factorial by reference in the phoenix expression, because the value at the time of building is empty. Totally guessing:
factorial = if_else( _1 == 0, 1, _1 * ref(factorial)( _1 - 1 ) ); Close, but, unfortunately doesn't work like this, factorial will be evaluated eagerly this way.
The solution is: factorial = if_else( _1 == 0, 1, _1 * bind(ref(factorial), _1 - 1)); factorial needs to be bound again ... bind and ref is from boost::phoenix. This only works with V3, and not with V2. You need to use the latest trunk, or wait for 1.47.