Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

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