
On Mon, Feb 23, 2009 at 7:43 PM, Eric Niebler <eric@boost-consulting.com> wrote:
Dean Michael Berris wrote:
Hi Guys,
I've recently tried to play around with Boost.Proto and I think I've run into a wall. I was trying to figure this (relatively simple) case out for a while already but it I'm at my wits end not seeing why the implementation doesn't work.
I'm pasting the contents of the file (unmodified) which I've tried to follow from the Getting Started document. I was trying to get the custom domain approach working, but I never seem to get the lazy function to be called.
<snip>
Hi Dean,
You were /so/ close to getting this to work, but you would have had to read more than the Getting Started guide. There is really only one error in your code....
Yup, I really should read more of the documentation in a room where I can focus 100%. ;-)
You create an expression extension with the BOOST_PROTO_EXTENDS() macro, and then also define an operator() overload. BOOST_PROTO_EXTENDS() defines operator() for you (check the docs) and the generated one is being preferred to yours because it is a non-const member function. You should use BOOST_PROTO_BASIC_EXTENDS() instead. Using proto::extends<> also would have saved you this trouble.
Ah, that makes sense. :-)
There's one other minor issue: you're creating an expression with proto::make_expr() but not specifying the domain. That's ok in this case because Proto deduces your domain correctly, but in some cases it can't so you should specify the domain.
The fixed code is below:
---->8--
[snip]
---->8--
Hope this helps,
Oh my, that was quick. Thanks Eric, it does work! Now on to fleshing out that DSEL... ;-) -- Dean Michael Berris | Software Engineer, Friendster, Inc. blog.cplusplus-soup.com | twitter.com/mikhailberis | linkedin.com/in/mikhailberis | profiles.friendster.com/mikhailberis | deanberris.com