Front Page / Metafunctions / Composition and Argument Binding / quote

# quote

### Synopsis

    template<
          template< typename P1 > class F
        , typename Tag = unspecified
        >
    struct quote1
    {
        // unspecified
        // ...
    };

    ...

    template<
          template< typename P1,... typename Pn > class F
        , typename Tag = unspecified
        >
    struct quoten
    {
        // unspecified
        // ...
    };

### Description

`quoten` is a higher-order primitive that wraps an n-ary Metafunction to create a corresponding Metafunction Class.

### Header

    #include <boost/mpl/quote.hpp>

### Model of

Metafunction Class

### Parameters

Parameter | Requirement | Description
--- | --- | ---
`F` | Metafunction | A metafunction to wrap.
`Tag` | Any type | A tag determining wrap semantics.

### Expression semantics

For any n-ary Metafunction `f` and arbitrary type `tag`:

    typedef quoten<f> g;
    typedef quoten<f,tag> g;

Return type: | Metafunction Class
Semantics: | Equivalent to
    struct g
    {
        template< typename A1,... typename An > struct apply
            : f<A1,...An>
        {
        };
    };
if `f<A1,...An>` has a nested type member `::type`, and to
    struct g
    {
        template< typename A1,... typename An > struct apply
        {
            typedef f<A1,...An> type;
        };
    };
otherwise.

### Example

    template< typename T > struct f1
    {
        typedef T type;
    };

    template<
        typename T1, typename T2, typename T3, typename T4, typename T5
        >
    struct f5
    {
        // no 'type' member!
    };

    typedef quote1<f1>::apply<int>::type t1;
    typedef quote5<f5>::apply<char,short,int,long,float>::type t5;

    BOOST_MPL_ASSERT(( is_same< t1, int > ));
    BOOST_MPL_ASSERT(( is_same< t5, f5<char,short,int,long,float> > ));

### See also

Composition and Argument Binding, invocation, `bind`, `lambda`, `protect`, `apply`