Front Page / Metafunctions / Composition and Argument Binding / lambda

# lambda

### Synopsis

    template<
          typename X
        , typename Tag = unspecified
        >
    struct lambda
    {
        typedef unspecified type;
    };

### Description

If `X` is a Placeholder Expression, transforms `X` into a corresponding Metafunction Class, otherwise `X` is returned unchanged.

### Header

    #include <boost/mpl/lambda.hpp>

### Parameters

Parameter | Requirement | Description
--- | --- | ---
`X` | Any type | An expression to transform.
`Tag` | Any type | A tag determining transform semantics.

### Expression semantics

For arbitrary types `x` and `tag`:

    typedef lambda<x>::type f;

Return type: | Metafunction Class.
Semantics: | If `x` is a Placeholder Expression in a general form `X<a1,...an>`, where `X` is a class template and `a1`,... `an` are arbitrary types, equivalent to
    typedef protect< bind<
          quoten<X>
        , lambda<a1>::type,... lambda<an>::type
        > > f;
otherwise, `f` is identical to `x`.

    typedef lambda<x,tag>::type f;

Return type: | Metafunction Class.
Semantics: | If `x` is a Placeholder Expression in a general form `X<a1,...an>`, where `X` is a class template and `a1`,... `an` are arbitrary types, equivalent to
    typedef protect< bind<
          quoten<X,tag>
        , lambda<a1,tag>::type,... lambda<an,tag>::type
        > > f;
otherwise, `f` is identical to `x`.

### Example

    template< typename N1, typename N2 > struct int_plus
        : int_<( N1::value + N2::value )>
    {
    };

    typedef lambda< int_plus<_1, int_<42> > >::type f1;
    typedef bind< quote2<int_plus>, _1, int_<42> > f2;

    typedef f1::apply<42>::type r1;
    typedef f2::apply<42>::type r2;

    BOOST_MPL_ASSERT_RELATION( r1::value, ==, 84 );
    BOOST_MPL_ASSERT_RELATION( r2::value, ==, 84 );

### See also

Composition and Argument Binding, invocation, Placeholders, `bind`, `quote`, `protect`, `apply`