• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. Metafunctions/Composition and Argument Binding//quote |40
2
3quote
4=====
5
6Synopsis
7--------
8
9.. parsed-literal::
10
11    template<
12          template< typename P1 > class F
13        , typename Tag = |unspecified|
14        >
15    struct quote1
16    {
17        // |unspecified|
18        // |...|
19    };
20
21    |...|
22
23    template<
24          template< typename P1,\ |...| typename P\ *n* > class F
25        , typename Tag = |unspecified|
26        >
27    struct quote\ *n*
28    {
29        // |unspecified|
30        // |...|
31    };
32
33
34Description
35-----------
36
37``quote``\ *n* is a higher-order primitive that wraps an *n*-ary |Metafunction| to create
38a corresponding |Metafunction Class|.
39
40
41Header
42------
43
44.. parsed-literal::
45
46    #include <boost/mpl/quote.hpp>
47
48
49Model of
50--------
51
52|Metafunction Class|
53
54
55Parameters
56----------
57
58+---------------+-----------------------+-----------------------------------------------+
59| Parameter     | Requirement           | Description                                   |
60+===============+=======================+===============================================+
61| ``F``         | |Metafunction|        | A metafunction to wrap.                       |
62+---------------+-----------------------+-----------------------------------------------+
63| ``Tag``       | Any type              | A tag determining wrap semantics.             |
64+---------------+-----------------------+-----------------------------------------------+
65
66
67Expression semantics
68--------------------
69
70For any *n*-ary |Metafunction| ``f`` and arbitrary type ``tag``:
71
72
73.. parsed-literal::
74
75    typedef quote\ *n*\ <f> g;
76    typedef quote\ *n*\ <f,tag> g;
77
78:Return type:
79    |Metafunction Class|
80
81:Semantics:
82    Equivalent to
83
84    .. parsed-literal::
85
86        struct g
87        {
88            template< typename A1,\ |...| typename A\ *n* > struct apply
89                : f<A1,\ |...|\ A\ *n*\ >
90            {
91            };
92        };
93
94    if ``f<A1,...An>`` has a nested type member ``::type``, and to
95
96    .. parsed-literal::
97
98        struct g
99        {
100            template< typename A1,\ |...| typename A\ *n* > struct apply
101            {
102                typedef f<A1,\ |...|\ A\ *n*\ > type;
103            };
104        };
105
106    otherwise.
107
108
109Example
110-------
111
112.. parsed-literal::
113
114    template< typename T > struct f1
115    {
116        typedef T type;
117    };
118
119    template<
120        typename T1, typename T2, typename T3, typename T4, typename T5
121        >
122    struct f5
123    {
124        // no 'type' member!
125    };
126
127    typedef quote\ ``1``\<f1>::apply<int>::type t1;
128    typedef quote\ ``5``\<f5>::apply<char,short,int,long,float>::type t5;
129
130    BOOST_MPL_ASSERT(( is_same< t1, int > ));
131    BOOST_MPL_ASSERT(( is_same< t5, f5<char,short,int,long,float> > ));
132
133
134See also
135--------
136
137|Composition and Argument Binding|, |Invocation|, |bind|, |lambda|, |protect|, |apply|
138
139
140.. copyright:: Copyright �  2001-2009 Aleksey Gurtovoy and David Abrahams
141   Distributed under the Boost Software License, Version 1.0. (See accompanying
142   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
143