1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0.1 Transitional//EN">
5 <meta http-equiv=
"Content-Type" content=
"text/html; charset=ISO-8859-1">
6 <title>Boost.Flyweight Documentation - Tutorial - Annex - MPL lambda expressions
</title>
7 <link rel=
"stylesheet" href=
"../style.css" type=
"text/css">
8 <link rel=
"start" href=
"../index.html">
9 <link rel=
"prev" href=
"technical.html">
10 <link rel=
"up" href=
"index.html">
11 <link rel=
"next" href=
"../reference/index.html">
15 <h1><img src=
"../../../../boost.png" alt=
"Boost logo" align=
16 "middle" width=
"277" height=
"86">Boost.Flyweight Tutorial Annex: MPL lambda expressions
</h1>
18 <div class=
"prev_link"><a href=
"technical.html"><img src=
"../prev.gif" alt=
"technical issues" border=
"0"><br>
21 <div class=
"up_link"><a href=
"index.html"><img src=
"../up.gif" alt=
"Boost.Flyweight tutorial" border=
"0"><br>
22 Boost.Flyweight tutorial
24 <div class=
"next_link"><a href=
"../reference/index.html"><img src=
"../next.gif" alt=
"Boost.Flyweight reference" border=
"0"><br>
25 Boost.Flyweight reference
26 </a></div><br clear=
"all" style=
"clear: all;">
30 <p>This short introduction to lambda expressions is meant for readers unfamiliar
31 with the
<a href=
"../../../mpl/doc/index.html">Boost MPL Library
</a> who
32 want to rapidly acquire a working knowledge of the basic concepts for the purposes
33 of using them in Boost.Flyweight. Please refer to the Boost.MPL documentation
34 for further information beyond these introductory notes.
38 The specifiers defined by Boost.Flyweight rely heavily on the
39 <a href=
"../../../mpl/doc/refmanual/lambda-expression.html"><code>Lambda
40 Expression
</code></a> concept defined by the
41 <a href=
"../../../mpl/doc/index.html">Boost MPL Library
</a>. A lambda
42 expression can be thought of as a compile-time
"type function", an entity (a
43 concrete type, actually) that can be invoked with a list of types and returns
44 some associated type in its turn. Consider for instance an arbitrary class
49 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>T
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Q
</span><span class=special
>></span>
50 <span class=keyword
>class
</span> <span class=identifier
>foo
</span>
51 <span class=special
>{
</span>
52 <span class=special
>...
</span>
53 <span class=special
>};
</span>
57 and suppose we want to have a lambda expression that, when invoked
58 with some generic types
<code>Arg1
</code> and
<code>Arg2
</code>,
59 returns
<code>foo
<Arg1,Arg2
></code>. Such a lambda expression
60 can be implemented in two ways
63 <a href=
"../../../mpl/doc/refmanual/metafunction-class.html"><code>MPL
64 Metafunction Class
</code></a>, a type with a special nested class template
65 named
<code>apply
</code>:
67 <span class=keyword
>struct
</span> <span class=identifier
>foo_specifier
</span>
68 <span class=special
>{
</span>
69 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Arg2
</span><span class=special
>></span>
70 <span class=keyword
>struct
</span> <span class=identifier
>apply
</span>
71 <span class=special
>{
</span>
72 <span class=comment
>// this is the
"return type
" of foo_specifier
</span>
73 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=identifier
>Arg2
</span><span class=special
>></span> <span class=identifier
>type
</span><span class=special
>;
</span>
74 <span class=special
>};
</span>
75 <span class=special
>};
</span>
80 <a href=
"../../../mpl/doc/refmanual/placeholder-expression.html"><code>MPL
81 Placeholder Expression
</code></a>, a class template instantiated with one or
82 more
<i>placeholders
</i>:
84 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>,
</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_2
</span><span class=special
>></span> <span class=identifier
>foo_specifier
</span><span class=special
>;
</span>
86 Note that, in this case,
<code>foo_specifier
</code> is a concrete type, much
87 as
<code>int
</code> or
<code>std::set
<std::string
></code> are; yet,
88 MPL internal mechanisms are able to detect that this type has been gotten
89 from instantiating a class template with placeholders
<code>boost::mpl::_1
</code>
90 and
<code>boost::mpl::_2
</code> and take these placeholders as slots to
91 be substituted for actual types (the first and second type supplied,
92 respectively) when
<code>foo_specifier
</code> is
93 invoked. So, an instantiation of
<code>foo
</code> can be used
94 to refer back to the
<code>foo
</code> class template itself! The net
95 effect is the same as with metafunctions, but placeholder expressions spare
96 us the need to write boilerplate metafunction classes
97 --and the kind of metaprogramming magic they depend on has an undeniable
101 So far the examples shown just forward the arguments
<code>Arg1
</code> and
102 <code>Arg2
</code> directly to a class template without further elaboration,
103 but there is nothing preventing us from doing some argument manipulation,
104 like, for instance, switching their places:
108 <span class=keyword
>struct
</span> <span class=identifier
>foo_specifier
</span>
109 <span class=special
>{
</span>
110 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Arg2
</span><span class=special
>></span>
111 <span class=keyword
>struct
</span> <span class=identifier
>apply
</span><span class=special
>{
</span><span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>Arg2
</span><span class=special
>,
</span><span class=identifier
>Arg1
</span><span class=special
>></span> <span class=identifier
>type
</span><span class=special
>;};
</span>
112 <span class=special
>};
</span>
114 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_2
</span><span class=special
>,
</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>></span> <span class=identifier
>foo_specifier
</span><span class=special
>;
</span>
118 passing placeholder subexpressions as arguments to the overall expression:
122 <span class=keyword
>struct
</span> <span class=identifier
>foo_specifier
</span>
123 <span class=special
>{
</span>
124 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Arg2
</span><span class=special
>></span>
125 <span class=keyword
>struct
</span> <span class=identifier
>apply
</span><span class=special
>{
</span><span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>shared_ptr
</span><span class=special
><</span><span class=identifier
>Arg1
</span><span class=special
>>,
</span><span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>less
</span><span class=special
><</span><span class=identifier
>Arg2
</span><span class=special
>></span> <span class=special
>></span> <span class=identifier
>type
</span><span class=special
>;};
</span>
126 <span class=special
>};
</span>
128 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span>
129 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>shared_ptr
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>>,
</span>
130 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>less
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_2
</span><span class=special
>></span>
131 <span class=special
>></span> <span class=identifier
>foo_specifier
</span><span class=special
>;
</span>
135 or accepting less or more arguments than the class template itself
136 (the number of parameters of a lambda expression is called its
<i>arity
</i>):
140 <span class=keyword
>struct
</span> <span class=identifier
>foo_specifier
</span>
141 <span class=special
>{
</span>
142 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>Arg1
</span><span class=special
>></span>
143 <span class=keyword
>struct
</span> <span class=identifier
>apply
</span><span class=special
>{
</span><span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>less
</span><span class=special
><</span><span class=identifier
>Arg1
</span><span class=special
>></span> <span class=identifier
>type
</span><span class=special
>;};
</span>
144 <span class=special
>};
</span>
146 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>,
</span><span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>less
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>></span> <span class=special
>></span> <span class=identifier
>foo_specifier
</span><span class=special
>;
</span>
148 <span class=keyword
>struct
</span> <span class=identifier
>foo_specifier
</span>
149 <span class=special
>{
</span>
150 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Arg2
</span><span class=special
>,
</span><span class=keyword
>typename
</span> <span class=identifier
>Arg3
</span><span class=special
>></span>
151 <span class=keyword
>struct
</span> <span class=identifier
>apply
</span><span class=special
>{
</span><span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>Arg1
</span><span class=special
>,
</span><span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>Arg2
</span><span class=special
>,
</span><span class=identifier
>Arg3
</span><span class=special
>></span> <span class=special
>></span> <span class=identifier
>type
</span><span class=special
>;};
</span>
152 <span class=special
>};
</span>
154 <span class=keyword
>typedef
</span> <span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_1
</span><span class=special
>,
</span><span class=identifier
>foo
</span><span class=special
><</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_2
</span><span class=special
>,
</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>mpl
</span><span class=special
>::
</span><span class=identifier
>_3
</span><span class=special
>></span> <span class=special
>></span> <span class=identifier
>foo_specifier
</span><span class=special
>;
</span>
159 <div class=
"prev_link"><a href=
"technical.html"><img src=
"../prev.gif" alt=
"technical issues" border=
"0"><br>
162 <div class=
"up_link"><a href=
"index.html"><img src=
"../up.gif" alt=
"Boost.Flyweight tutorial" border=
"0"><br>
163 Boost.Flyweight tutorial
165 <div class=
"next_link"><a href=
"../reference/index.html"><img src=
"../next.gif" alt=
"Boost.Flyweight reference" border=
"0"><br>
166 Boost.Flyweight reference
167 </a></div><br clear=
"all" style=
"clear: all;">
171 <p>Revised August
13th
2008</p>
173 <p>© Copyright
2006-
2008 Joaqu
ín M L
ópez Mu
ñoz.
174 Distributed under the Boost Software
175 License, Version
1.0. (See accompanying file
<a href=
"../../../../LICENSE_1_0.txt">
176 LICENSE_1_0.txt
</a> or copy at
<a href=
"http://www.boost.org/LICENSE_1_0.txt">
177 http://www.boost.org/LICENSE_1_0.txt
</a>)