Boost logo

Boost :

From: Alexander Nasonov (alnsn_at_[hidden])
Date: 2007-08-21 07:06:17


Steven Watanabe <steven <at> providere-consulting.com> writes:

>
> AMDG
>
> The local structs are not essential. You can
> use tuples.

I like this idea.

> I too would definitely like to see something like
>
> int main() {
>
> int i = 0;
>
> BOOST_LOCAL_FUNCTION(f, (i), (int, v)) {
> i = v;
> } BOOST_LOCAL_FUNCTION_END;
>
> f(2); // i = 2
>
> }

How about this?

int BOOST_LOCAL_FUNCTION( (v) ) (int i)
{
    return v = i;
} BOOST_LOCAL_FUNCTION_END

You can think of it as if BOOST_LOCAL_FUNCTION macro invocation
has been expanded to local function name.
I'm not sure that it's possible in typeof emulation, though :(

Here is how this construction looks after preprocessing:

// Line 1.
int

(*sig_1)();

typedef typeof(v) typeof_v_1;
typedef boost::tuple<typeof_v_1&> tuple_t_1;

tuple_t_1 tuple_1(v);

{ // __LINE__ suffix can be omitted inside this block.

    typedef typeof(sig_1()) result_t;

    typedef tuple_t_1 tuple_t;

    tuple_t& tuple = tuple_1;

    struct scope_exit_body_t {

        typeof_v_1& v;

        scope_exit_body_t(tuple_t& tuple)
          : v(tuple.get<0>())
        {}

        result_t

        // Lines 2-5.
        operator()(int i) const
        {
            return i = v;
        }

        // Line 6.
    };

    typedef typeof(&scope_exit_body_t::operator()) native_typeof_only;
}

> In Christ,
> Steven Watanabe

--
Alexander

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