Back to Arangodb

quote

3rdParty/boost/1.78.0/libs/mpl/doc/src/refmanual/quote.rst

3.12.9.13.0 KB
Original Source

.. Metafunctions/Composition and Argument Binding//quote |40

quote

Synopsis

.. parsed-literal::

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

|...|

template<
      template< typename P1,\ |...| typename P\ *n* > class F
    , typename Tag = |unspecified|
    >
struct quote\ *n*
{
    // |unspecified|
    // |...|
};    

Description

quote\ n is a higher-order primitive that wraps an n-ary |Metafunction| to create a corresponding |Metafunction Class|.

.. parsed-literal::

#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:

.. parsed-literal::

typedef quote\ *n*\ <f> g;
typedef quote\ *n*\ <f,tag> g;

:Return type: |Metafunction Class|

:Semantics: Equivalent to

.. parsed-literal::

    struct g
    {
        template< typename A1,\ |...| typename A\ *n* > struct apply
            : f<A1,\ |...|\ A\ *n*\ >
        {
        };
    };
    
if ``f<A1,...An>`` has a nested type member ``::type``, and to

.. parsed-literal::

    struct g
    {
        template< typename A1,\ |...| typename A\ *n* > struct apply
        {
            typedef f<A1,\ |...|\ A\ *n*\ > type;
        };
    };

otherwise.

Example

.. parsed-literal::

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 quote\ ``1``\<f1>::apply<int>::type t1;
typedef quote\ ``5``\<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|

.. copyright:: Copyright 2001-2009 Aleksey Gurtovoy and David Abrahams Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)