Boost logo

Boost :

Subject: Re: [boost] [local] Help for the Alternatives section
From: lcaminiti (lorcaminiti_at_[hidden])
Date: 2011-03-28 12:37:00


lcaminiti wrote:
>
> On Sun, Mar 27, 2011 at 11:35 AM, Thomas Heller
> <thom.heller_at_[hidden]> wrote:
> > On Sunday, March 27, 2011 05:43:39 PM Lorenzo Caminiti wrote:
> >> On Sun, Mar 27, 2011 at 10:07 AM, Thomas Heller
> >> <thom.heller_at_[hidden]> wrote:
> >> > The guy who wrote the code could have said: const int factor
> = 10;
> > assignment
> >> > would then be impossible^W not allowed.
> >>
> >> Yes, but the use case would be to have factor const *only* within
> the
> >> "function" passed to for_each while keeping it mutable
> in the
> >> enclosing scope. Therefore, programmers have to declare factor
> >> not-const within main() and I was wondering if there was a way
> using
> >> Phoenix to add the const only locally within the
> "function" passed to
> >> for_each (this is done by Boost.Loccal using
> "constant-binding" as in
> >> `const bind& factor`).
> >
> > Oh right, you can do that ...:
> >
> > let(_a = ref(factor))[...]; // <-- bind as non-const reference
> > let(_a = cref(factor))[...]; // <-- bind as const reference
>
> Yes, I think that is what I was looking for. I will add it to the
> Boost.Phoenix example.
>

This worked :)) Finally Boost.Local's Phoenix example reads:

#include <boost/spirit/include/phoenix.hpp>
#include
#include
#include

int main() {
    double sum = 0.0;
    int factor = 10;

    std::vector v(3);
    v[0] = 1.0; v[1] = 2.0; v[2] = 3.0;

    // Passed as template parameter and also defined at expression level.
    std::for_each(v.begin(), v.end(), boost::phoenix::let(
            // Bind `factor` by constant (reference).
            boost::phoenix::local_names::_f = boost::phoenix::cref(factor))[
        // Unfortunately, body cannot use C++ statement syntax.
        // Access `sum` by (non-constant) reference.
        boost::phoenix::ref(sum) += boost::phoenix::local_names::_f *
                boost::phoenix::arg_names::_1,
        std::cout << boost::phoenix::val("Summed: ") <<
                boost::phoenix::ref(sum) << "\n"
    ]);

    std::cout << sum << std::endl;
    return 0;
}

BTW, this is pretty powerful stuff ;)

--Lorenzo

--
View this message in context: http://boost.2283326.n4.nabble.com/local-Help-for-the-Alternatives-section-tp3408469p3412328.html
Sent from the Boost - Dev mailing list archive at Nabble.com.

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk