• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. Metafunctions/Composition and Argument Binding//bind |30
2
3bind
4====
5
6Synopsis
7--------
8
9.. parsed-literal::
10
11    template<
12          typename F
13        >
14    struct bind0
15    {
16        // |unspecified|
17        // |...|
18    };
19
20    template<
21          typename F, typename A1
22        >
23    struct bind1
24    {
25        // |unspecified|
26        // |...|
27    };
28
29    |...|
30
31    template<
32          typename F, typename A1,\ |...| typename An
33        >
34    struct bind\ *n*
35    {
36        // |unspecified|
37        // |...|
38    };
39
40    template<
41          typename F
42        , typename A1 = |unspecified|
43        |...|
44        , typename An = |unspecified|
45        >
46    struct bind
47    {
48        // |unspecified|
49        // |...|
50    };
51
52
53Description
54-----------
55
56``bind`` is a higher-order primitive for |Metafunction Class| composition
57and argument binding. In essence, it's a compile-time counterpart of
58the similar run-time functionality provided by |Boost.Bind| and |Boost.Lambda|
59libraries.
60
61
62Header
63------
64
65.. parsed-literal::
66
67    #include <boost/mpl/bind.hpp>
68
69
70Model of
71--------
72
73|Metafunction Class|
74
75
76Parameters
77----------
78
79+---------------+-----------------------------------+-----------------------------------------------+
80| Parameter     | Requirement                       | Description                                   |
81+===============+===================================+===============================================+
82| ``F``         | |Metafunction Class|              | An metafunction class to perform binding on.  |
83+---------------+-----------------------------------+-----------------------------------------------+
84| |A1...An|     | Any type                          | Arguments to bind.                            |
85+---------------+-----------------------------------+-----------------------------------------------+
86
87
88Expression semantics
89--------------------
90
91For any |Metafunction Class| ``f`` and arbitrary types |a1...an|:
92
93.. parsed-literal::
94
95    typedef bind<f,a1,...a\ *n*\ > g;
96    typedef bind\ *n*\ <f,a1,...a\ *n*\ > g;
97
98:Return type:
99    |Metafunction Class|
100
101.. _`bind semantics`:
102
103:Semantics:
104    Equivalent to
105
106    .. parsed-literal::
107
108        struct g
109        {
110            template<
111                  typename U1 = |unspecified|
112                |...|
113                , typename U\ *n* = |unspecified|
114                >
115            struct apply
116                : apply_wrap\ *n*\ <
117                      typename h0<f,U1,\ |...|\ U\ *n*>::type
118                    , typename h1<a1,U1,\ |...|\ U\ *n*>::type
119                    |...|
120                    , typename h\ *n*\ <a\ *n*\ ,U1,\ |...|\ U\ *n*>::type
121                    >
122            {
123            };
124        };
125
126    where ``h``\ *k* is equivalent to
127
128    .. parsed-literal::
129
130        template< typename X, typename U1,\ |...| typename U\ *n* > struct h\ *k*
131            : apply_wrap\ *n*\ <X,U1,\ |...|\ U\ *n*>
132        {
133        };
134
135    if ``f`` or ``a``\ *k* is a |bind expression| or a |placeholder|, and
136
137    .. parsed-literal::
138
139        template< typename X, typename U1,\ |...| typename U\ *n* > struct h\ *k*
140        {
141            typedef X type;
142        };
143
144    otherwise. |Note:| Every ``n``\th appearance of the `unnamed placeholder`__
145    in the ``bind<f,a1,...an>`` specialization is replaced with the corresponding
146    numbered placeholder ``_``\ *n* |-- end note|
147
148__ `Placeholders`_
149
150
151Example
152-------
153
154.. parsed-literal::
155
156    struct f1
157    {
158        template< typename T1 > struct apply
159        {
160            typedef T1 type;
161        };
162    };
163
164    struct f5
165    {
166        template< typename T1, typename T2, typename T3, typename T4, typename T5 >
167        struct apply
168        {
169            typedef T5 type;
170        };
171    };
172
173    typedef apply_wrap\ ``1``\<
174          bind\ ``1``\<f1,_1>
175        , int
176        >::type r11;
177
178    typedef apply_wrap\ ``5``\<
179          bind\ ``1``\<f1,_5>
180        , void,void,void,void,int
181        >::type r12;
182
183    BOOST_MPL_ASSERT(( is_same<r11,int> ));
184    BOOST_MPL_ASSERT(( is_same<r12,int> ));
185
186    typedef apply_wrap\ ``5``\<
187          bind\ ``5``\<f5,_1,_2,_3,_4,_5>
188        , void,void,void,void,int
189        >::type r51;
190
191    typedef apply_wrap\ ``5``\<
192          bind\ ``5``\<f5,_5,_4,_3,_2,_1>
193        , int,void,void,void,void
194        >::type r52;
195
196    BOOST_MPL_ASSERT(( is_same<r51,int> ));
197    BOOST_MPL_ASSERT(( is_same<r52,int> ));
198
199
200See also
201--------
202
203|Composition and Argument Binding|, |Invocation|, |Placeholders|, |lambda|, |quote|,
204|protect|, |apply|, |apply_wrap|
205
206
207.. copyright:: Copyright �  2001-2009 Aleksey Gurtovoy and David Abrahams
208   Distributed under the Boost Software License, Version 1.0. (See accompanying
209   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
210