• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Chapter 1. Boost.Bind</title>
5<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="bind.html" title="Chapter 1. Boost.Bind">
8</head>
9<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
10<table cellpadding="2" width="100%"><tr>
11<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
12<td align="center"><a href="../../../../index.html">Home</a></td>
13<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
14<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
15<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
16<td align="center"><a href="../../../../more/index.htm">More</a></td>
17</tr></table>
18<hr>
19<div class="spirit-nav"></div>
20<div class="chapter">
21<div class="titlepage"><div>
22<div><h2 class="title">
23<a name="bind"></a>Chapter 1. Boost.Bind</h2></div>
24<div><p class="copyright">Copyright © 2001, 2002 Peter Dimov and Multi Media Ltd.</p></div>
25<div><p class="copyright">Copyright © 2003-2008 Peter Dimov</p></div>
26<div><div class="legalnotice">
27<a name="bind.legal"></a><p>
28        Distributed under the <a href="http://boost.org/LICENSE_1_0.txt" target="_top">Boost
29        Software License, Version 1.0</a>.
30      </p>
31</div></div>
32</div></div>
33<div class="toc">
34<p><b>Table of Contents</b></p>
35<dl class="toc">
36<dt><span class="section"><a href="bind.html#bind.purpose">Purpose</a></span></dt>
37<dd><dl>
38<dt><span class="section"><a href="bind.html#bind.purpose.using_bind_with_functions_and_fu">Using
39      bind with functions and function pointers</a></span></dt>
40<dt><span class="section"><a href="bind.html#bind.purpose.with_function_objects">Using bind with function
41      objects</a></span></dt>
42<dt><span class="section"><a href="bind.html#bind.purpose.using_bind_with_pointers_to_memb">Using
43      bind with pointers to members</a></span></dt>
44<dt><span class="section"><a href="bind.html#bind.purpose.using_nested_binds_for_function_">Using
45      nested binds for function composition</a></span></dt>
46<dt><span class="section"><a href="bind.html#bind.purpose.overloaded_operators_new_in_boos">Overloaded
47      operators (new in Boost 1.33)</a></span></dt>
48</dl></dd>
49<dt><span class="section"><a href="bind.html#bind.examples">Examples</a></span></dt>
50<dd><dl>
51<dt><span class="section"><a href="bind.html#bind.examples.using_bind_with_standard_algorit">Using
52      bind with standard algorithms</a></span></dt>
53<dt><span class="section"><a href="bind.html#bind.examples.using_bind_with_boost_function">Using bind
54      with Boost.Function</a></span></dt>
55</dl></dd>
56<dt><span class="section"><a href="bind.html#bind.limitations">Limitations</a></span></dt>
57<dt><span class="section"><a href="bind.html#bind.faq">Frequently Asked Questions</a></span></dt>
58<dd><dl>
59<dt><span class="section"><a href="bind.html#bind.faq.why_doesn_t_this_compile">Why doesn't this compile?</a></span></dt>
60<dt><span class="section"><a href="bind.html#bind.faq.why_does_this_compile_it_should_">Why does this
61      compile? It should not.</a></span></dt>
62<dt><span class="section"><a href="bind.html#bind.faq.Q_forms">What is the difference between <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code> and
63      <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>?</a></span></dt>
64<dt><span class="section"><a href="bind.html#bind.faq.does_bind_work_with_windows_api_">Does bind
65      work with Windows API functions?</a></span></dt>
66<dt><span class="section"><a href="bind.html#bind.faq.does_bind_work_with_com_methods">Does bind work
67      with COM methods?</a></span></dt>
68<dt><span class="section"><a href="bind.html#bind.faq.does_bind_work_with_mac_toolbox_">Does bind
69      work with Mac toolbox functions?</a></span></dt>
70<dt><span class="section"><a href="bind.html#bind.faq.does_bind_work_with_extern_c_fun">Does bind
71      work with extern "C" functions?</a></span></dt>
72<dt><span class="section"><a href="bind.html#bind.faq.why_doesn_t_bind_automatically_r">Why doesn't
73      bind automatically recognize nonstandard functions?</a></span></dt>
74</dl></dd>
75<dt><span class="section"><a href="bind.html#bind.troubleshooting">Troubleshooting</a></span></dt>
76<dd><dl>
77<dt><span class="section"><a href="bind.html#bind.troubleshooting.incorrect_number_of_arguments">Incorrect
78      number of arguments</a></span></dt>
79<dt><span class="section"><a href="bind.html#bind.troubleshooting.the_function_object_cannot_be_ca">The
80      function object cannot be called with the specified arguments</a></span></dt>
81<dt><span class="section"><a href="bind.html#bind.troubleshooting.accessing_an_argument_that_does_">Accessing
82      an argument that does not exist</a></span></dt>
83<dt><span class="section"><a href="bind.html#bind.troubleshooting.inappropriate_use_of_bind_f">Inappropriate
84      use of <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code></a></span></dt>
85<dt><span class="section"><a href="bind.html#bind.troubleshooting.inappropriate_use_of_bind_r_f">Inappropriate
86      use of <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code></a></span></dt>
87<dt><span class="section"><a href="bind.html#bind.troubleshooting.binding_a_nonstandard_function">Binding
88      a nonstandard function</a></span></dt>
89<dt><span class="section"><a href="bind.html#bind.troubleshooting.binding_an_overloaded_function">Binding
90      an overloaded function</a></span></dt>
91<dt><span class="section"><a href="bind.html#bind.troubleshooting.modeling_stl_function_object_con">Modeling
92      STL function object concepts</a></span></dt>
93<dt><span class="section"><a href="bind.html#bind.troubleshooting.const_in_signatures"><code class="computeroutput"><span class="keyword">const</span></code> in signatures</a></span></dt>
94<dt><span class="section"><a href="bind.html#bind.troubleshooting.msvc_specific_using_boost_bind">MSVC
95      specific: <code class="computeroutput"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">;</span></code></a></span></dt>
96<dt><span class="section"><a href="bind.html#bind.troubleshooting.msvc_specific_class_templates_sh">MSVC
97      specific: class templates shadow function templates</a></span></dt>
98<dt><span class="section"><a href="bind.html#bind.troubleshooting.msvc_specific_in_signatures_trea">MSVC
99      specific: <code class="computeroutput"><span class="special">...</span></code> in signatures treated
100      as type</a></span></dt>
101</dl></dd>
102<dt><span class="section"><a href="bind.html#bind.interface">Interface</a></span></dt>
103<dd><dl>
104<dt><span class="section"><a href="bind.html#bind.interface.synopsys">Synopsis</a></span></dt>
105<dt><span class="section"><a href="bind.html#bind.interface.common_requirements">Common requirements</a></span></dt>
106<dt><span class="section"><a href="bind.html#bind.interface.common_definitions">Common definitions</a></span></dt>
107<dt><span class="section"><a href="bind.html#bind.interface.bind"><code class="computeroutput"><span class="identifier">bind</span></code></a></span></dt>
108<dt><span class="section"><a href="bind.html#bind.interface.additional_overloads">Additional overloads</a></span></dt>
109</dl></dd>
110<dt><span class="section"><a href="bind.html#bind.implementation">Implementation</a></span></dt>
111<dd><dl>
112<dt><span class="section"><a href="bind.html#bind.implementation.files">Files</a></span></dt>
113<dt><span class="section"><a href="bind.html#bind.implementation.dependencies">Dependencies</a></span></dt>
114<dt><span class="section"><a href="bind.html#bind.implementation.number_of_arguments">Number of Arguments</a></span></dt>
115<dt><span class="section"><a href="bind.html#bind.implementation.stdcall"><code class="computeroutput"><span class="identifier">__stdcall</span></code>,
116      <code class="computeroutput"><span class="identifier">__cdecl</span></code>, <code class="computeroutput"><span class="identifier">__fastcall</span></code>,
117      and <code class="computeroutput"><span class="identifier">pascal</span></code> Support</a></span></dt>
118<dt><span class="section"><a href="bind.html#bind.implementation.visit_each_support"><code class="computeroutput"><span class="identifier">visit_each</span></code> support</a></span></dt>
119</dl></dd>
120<dt><span class="section"><a href="bind.html#bind.acknowledgements">Acknowledgements</a></span></dt>
121</dl>
122</div>
123<div class="section">
124<div class="titlepage"><div><div><h2 class="title" style="clear: both">
125<a name="bind.purpose"></a><a class="link" href="bind.html#bind.purpose" title="Purpose">Purpose</a>
126</h2></div></div></div>
127<p>
128      <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code> is a generalization of the standard
129      functions <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind1st</span></code> and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind2nd</span></code>.
130      It supports arbitrary function objects, functions, function pointers, and member
131      function pointers, and is able to bind any argument to a specific value or
132      route input arguments into arbitrary positions. <code class="computeroutput"><span class="identifier">bind</span></code>
133      does not place any requirements on the function object; in particular, it does
134      not need the <code class="computeroutput"><span class="identifier">result_type</span></code>,
135      <code class="computeroutput"><span class="identifier">first_argument_type</span></code> and <code class="computeroutput"><span class="identifier">second_argument_type</span></code> standard typedefs.
136    </p>
137<div class="section">
138<div class="titlepage"><div><div><h3 class="title">
139<a name="bind.purpose.using_bind_with_functions_and_fu"></a><a class="link" href="bind.html#bind.purpose.using_bind_with_functions_and_fu" title="Using bind with functions and function pointers">Using
140      bind with functions and function pointers</a>
141</h3></div></div></div>
142<p>
143        Given these definitions:
144      </p>
145<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">)</span>
146<span class="special">{</span>
147    <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span><span class="special">;</span>
148<span class="special">}</span>
149
150<span class="keyword">int</span> <span class="identifier">g</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">c</span><span class="special">)</span>
151<span class="special">{</span>
152    <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span> <span class="special">+</span> <span class="identifier">c</span><span class="special">;</span>
153<span class="special">}</span>
154</pre>
155<p>
156        <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span></code>
157        will produce a "nullary" function object that takes no arguments
158        and returns <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span></code>. Similarly, <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span>
159        <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">)()</span></code> is equivalent <code class="computeroutput"><span class="identifier">to</span>
160        <span class="identifier">g</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span></code>.
161      </p>
162<p>
163        It is possible to selectively bind only some of the arguments. <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span>
164        <span class="number">5</span><span class="special">)(</span><span class="identifier">x</span><span class="special">)</span></code> is equivalent
165        to <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="number">5</span><span class="special">)</span></code>; here <code class="computeroutput"><span class="identifier">_1</span></code>
166        is a <span class="emphasis"><em>placeholder</em></span> argument that means "substitute
167        with the first input argument."
168      </p>
169<p>
170        For comparison, here is the same operation expressed with the standard library
171        primitives:
172      </p>
173<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind2nd</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptr_fun</span><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="number">5</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>
174</pre>
175<p>
176        <code class="computeroutput"><span class="identifier">bind</span></code> covers the functionality
177        of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind1st</span></code> as well:
178      </p>
179<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind1st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptr_fun</span><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="number">5</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>   <span class="comment">// f(5, x)</span>
180<span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>                     <span class="comment">// f(5, x)</span>
181</pre>
182<p>
183        <code class="computeroutput"><span class="identifier">bind</span></code> can handle functions
184        with more than two arguments, and its argument substitution mechanism is
185        more general:
186      </p>
187<pre class="programlisting"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">);</span>                 <span class="comment">// f(y, x)</span>
188<span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="number">9</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>                 <span class="comment">// g(x, 9, x)</span>
189<span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">_3</span><span class="special">,</span> <span class="identifier">_3</span><span class="special">,</span> <span class="identifier">_3</span><span class="special">)(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">);</span>          <span class="comment">// g(z, z, z)</span>
190<span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">);</span>          <span class="comment">// g(x, x, x)</span>
191</pre>
192<p>
193        Note that, in the last example, the function object produced by <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span>
194        <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span></code> does
195        not contain references to any arguments beyond the first, but it can still
196        be used with more than one argument. Any extra arguments are silently ignored,
197        just like the first and the second argument are ignored in the third example.
198      </p>
199<p>
200        The arguments that <code class="computeroutput"><span class="identifier">bind</span></code> takes
201        are copied and held internally by the returned function object. For example,
202        in the following code:
203      </p>
204<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span>
205<span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
206</pre>
207<p>
208        a copy of the value of <code class="computeroutput"><span class="identifier">i</span></code>
209        is stored into the function object. <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code></a> and <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code></a> can be used to make the function
210        object store a reference to an object, rather than a copy:
211      </p>
212<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span>
213<span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span> <span class="identifier">_1</span><span class="special">);</span>
214<span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">cref</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span> <span class="identifier">_1</span><span class="special">);</span>
215</pre>
216</div>
217<div class="section">
218<div class="titlepage"><div><div><h3 class="title">
219<a name="bind.purpose.with_function_objects"></a><a class="link" href="bind.html#bind.purpose.with_function_objects" title="Using bind with function objects">Using bind with function
220      objects</a>
221</h3></div></div></div>
222<p>
223        <code class="computeroutput"><span class="identifier">bind</span></code> is not limited to functions;
224        it accepts arbitrary function objects. In the general case, the return type
225        of the generated function object's <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code> has to be specified explicitly (without
226        a <code class="computeroutput"><span class="identifier">typeof</span></code> operator the return
227        type cannot be inferred):
228      </p>
229<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">F</span>
230<span class="special">{</span>
231    <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">-</span> <span class="identifier">b</span><span class="special">;</span> <span class="special">}</span>
232    <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">long</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">;</span> <span class="special">}</span>
233<span class="special">};</span>
234
235<span class="identifier">F</span> <span class="identifier">f</span><span class="special">;</span>
236<span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">104</span><span class="special">;</span>
237<span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>		<span class="comment">// f(x, x), i.e. zero</span>
238</pre>
239<p>
240        Some compilers have trouble with the <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
241        syntax. For portability reasons, an alternative way to express the above
242        is supported:
243      </p>
244<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(),</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>
245</pre>
246<p>
247        Note, however, that the alternative syntax is provided only as a workaround.
248        It is not part of the interface.
249      </p>
250<p>
251        When the function object exposes a nested type named <code class="computeroutput"><span class="identifier">result_type</span></code>,
252        the explicit return type can be omitted:
253      </p>
254<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">8</span><span class="special">;</span>
255<span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(),</span> <span class="identifier">_1</span><span class="special">,</span> <span class="number">9</span><span class="special">)(</span><span class="identifier">x</span><span class="special">);</span>	<span class="comment">// x &lt; 9</span>
256</pre>
257<p>
258        <span class="emphasis"><em>[Note:</em></span> the ability to omit the return type is not available
259        on all compilers.<span class="emphasis"><em>]</em></span>
260      </p>
261<p>
262        By default, <code class="computeroutput"><span class="identifier">bind</span></code> makes a
263        copy of the provided function object. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> and
264        <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span></code> can be used to make it store a reference
265        to the function object, rather than a copy. This can be useful when the function
266        object is non-copyable, expensive to copy, or contains state; of course,
267        in this case the programmer is expected to ensure that the function object
268        is not destroyed while it's still being used.
269      </p>
270<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">F2</span>
271<span class="special">{</span>
272    <span class="keyword">int</span> <span class="identifier">s</span><span class="special">;</span>
273
274    <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">result_type</span><span class="special">;</span>
275    <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">s</span> <span class="special">+=</span> <span class="identifier">x</span><span class="special">;</span> <span class="special">}</span>
276<span class="special">};</span>
277
278<span class="identifier">F2</span> <span class="identifier">f2</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0</span> <span class="special">};</span>
279<span class="keyword">int</span> <span class="identifier">a</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span> <span class="special">};</span>
280
281<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">a</span><span class="special">+</span><span class="number">3</span><span class="special">,</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">f2</span><span class="special">),</span> <span class="identifier">_1</span><span class="special">));</span>
282
283<span class="identifier">assert</span><span class="special">(</span><span class="identifier">f2</span><span class="special">.</span><span class="identifier">s</span> <span class="special">==</span> <span class="number">6</span><span class="special">);</span>
284</pre>
285</div>
286<div class="section">
287<div class="titlepage"><div><div><h3 class="title">
288<a name="bind.purpose.using_bind_with_pointers_to_memb"></a><a class="link" href="bind.html#bind.purpose.using_bind_with_pointers_to_memb" title="Using bind with pointers to members">Using
289      bind with pointers to members</a>
290</h3></div></div></div>
291<p>
292        Pointers to member functions and pointers to data members are not function
293        objects, because they do not support <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>. For convenience, <code class="computeroutput"><span class="identifier">bind</span></code>
294        accepts member pointers as its first argument, and the behavior is as if
295        <a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a>
296        has been used to convert the member pointer into a function object. In other
297        words, the expression
298      </p>
299<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">args</span><span class="special">)</span>
300</pre>
301<p>
302        is equivalent to
303      </p>
304<pre class="programlisting"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">args</span><span class="special">)</span>
305</pre>
306<p>
307        where <code class="computeroutput"><span class="identifier">R</span></code> is the return type
308        of <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span></code> (for member functions) or the type of
309        the member (for data members.)
310      </p>
311<p>
312        <span class="emphasis"><em>[Note:</em></span> <code class="computeroutput"><span class="identifier">mem_fn</span></code>
313        creates function objects that are able to accept a pointer, a reference,
314        or a smart pointer to an object as its first argument; for additional information,
315        see the <code class="computeroutput"><span class="identifier">mem_fn</span></code> <a href="../../../../libs/bind/mem_fn.html" target="_top">documentation</a>.<span class="emphasis"><em>]</em></span>
316      </p>
317<p>
318        Example:
319      </p>
320<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
321<span class="special">{</span>
322    <span class="keyword">bool</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">);</span>
323<span class="special">};</span>
324
325<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
326<span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="identifier">p</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">X</span><span class="special">);</span>
327<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">5</span><span class="special">;</span>
328
329<span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">),</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">i</span><span class="special">);</span>		<span class="comment">// x.f(i)</span>
330<span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">i</span><span class="special">);</span>			<span class="comment">// (&amp;x)-&gt;f(i)</span>
331<span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">i</span><span class="special">);</span>			<span class="comment">// (internal copy of x).f(i)</span>
332<span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">i</span><span class="special">);</span>			<span class="comment">// (internal copy of p)-&gt;f(i)</span>
333</pre>
334<p>
335        The last two examples are interesting in that they produce "self-contained"
336        function objects. <code class="computeroutput"><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">x</span><span class="special">,</span>
337        <span class="identifier">_1</span><span class="special">)</span></code>
338        stores a copy of <code class="computeroutput"><span class="identifier">x</span></code>. <code class="computeroutput"><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">p</span><span class="special">,</span>
339        <span class="identifier">_1</span><span class="special">)</span></code>
340        stores a copy of <code class="computeroutput"><span class="identifier">p</span></code>, and since
341        <code class="computeroutput"><span class="identifier">p</span></code> is a <a href="../../../../libs/smart_ptr/doc/html/smart_ptr.html#shared_ptr" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span></code></a>, the function object
342        retains a reference to its instance of <code class="computeroutput"><span class="identifier">X</span></code>
343        and will remain valid even when <code class="computeroutput"><span class="identifier">p</span></code>
344        goes out of scope or is <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code>.
345      </p>
346</div>
347<div class="section">
348<div class="titlepage"><div><div><h3 class="title">
349<a name="bind.purpose.using_nested_binds_for_function_"></a><a class="link" href="bind.html#bind.purpose.using_nested_binds_for_function_" title="Using nested binds for function composition">Using
350      nested binds for function composition</a>
351</h3></div></div></div>
352<p>
353        Some of the arguments passed to <code class="computeroutput"><span class="identifier">bind</span></code>
354        may be nested <span class="emphasis"><em>bind expressions</em></span> themselves:
355      </p>
356<pre class="programlisting"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">))(</span><span class="identifier">x</span><span class="special">);</span>               <span class="comment">// f(g(x))</span>
357</pre>
358<p>
359        The inner <span class="emphasis"><em>bind expressions</em></span> are evaluated, in unspecified
360        order, before the outer <code class="computeroutput"><span class="identifier">bind</span></code>
361        when the function object is called; the results of the evaluation are then
362        substituted in their place when the outer <code class="computeroutput"><span class="identifier">bind</span></code>
363        is evaluated. In the example above, when the function object is called with
364        the argument list <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>, <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">g</span><span class="special">,</span>
365        <span class="identifier">_1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">)</span></code> is evaluated
366        first, yielding <code class="computeroutput"><span class="identifier">g</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>, and
367        then <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">g</span><span class="special">(</span><span class="identifier">x</span><span class="special">))(</span><span class="identifier">x</span><span class="special">)</span></code> is evaluated,
368        yielding the final result <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">g</span><span class="special">(</span><span class="identifier">x</span><span class="special">))</span></code>.
369      </p>
370<p>
371        This feature of <code class="computeroutput"><span class="identifier">bind</span></code> can
372        be used to perform function composition. See <a href="../../bind_as_compose.cpp" target="_top">bind_as_compose.cpp</a>
373        for an example that demonstrates how to use <code class="computeroutput"><span class="identifier">bind</span></code>
374        to achieve similar functionality to <a href="http://www.boost.org/doc/libs/1_31_0/libs/compose/index.htm" target="_top">Boost.Compose</a>.
375      </p>
376<p>
377        Note that the first argument - the bound function object - is not evaluated,
378        even when it's a function object that is produced by <code class="computeroutput"><span class="identifier">bind</span></code>
379        or a <span class="emphasis"><em>placeholder</em></span> argument, so the example below does
380        not work as expected:
381      </p>
382<pre class="programlisting"><span class="keyword">typedef</span> <span class="keyword">void</span> <span class="special">(*</span><span class="identifier">pf</span><span class="special">)(</span><span class="keyword">int</span><span class="special">);</span>
383
384<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">pf</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">;</span>
385<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">_1</span><span class="special">,</span> <span class="number">5</span><span class="special">));</span>
386</pre>
387<p>
388        The desired effect can be achieved via a helper function object <code class="computeroutput"><span class="identifier">apply</span></code> that applies its first argument,
389        as a function object, to the rest of its argument list. For convenience,
390        an implementation of <code class="computeroutput"><span class="identifier">apply</span></code>
391        is provided in the <a href="../../../../boost/bind/apply.hpp" target="_top">apply.hpp</a>
392        header file. Here is how the modified version of the previous example looks
393        like:
394      </p>
395<pre class="programlisting"><span class="keyword">typedef</span> <span class="keyword">void</span> <span class="special">(*</span><span class="identifier">pf</span><span class="special">)(</span><span class="keyword">int</span><span class="special">);</span>
396
397<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">pf</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">;</span>
398<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;(),</span> <span class="identifier">_1</span><span class="special">,</span> <span class="number">5</span><span class="special">));</span>
399</pre>
400<p>
401        Although the first argument is, by default, not evaluated, all other arguments
402        are. Sometimes it is necessary not to evaluate arguments subsequent to the
403        first, even when they are nested <span class="emphasis"><em>bind subexpressions</em></span>.
404        This can be achieved with the help of another function object, <code class="computeroutput"><span class="identifier">protect</span></code>, that masks the type so that <code class="computeroutput"><span class="identifier">bind</span></code> does not recognize and evaluate it.
405        When called, protect simply forwards the argument list to the other function
406        object unmodified.
407      </p>
408<p>
409        The header <a href="../../../../boost/bind/protect.hpp" target="_top">protect.hpp</a>
410        contains an implementation of <code class="computeroutput"><span class="identifier">protect</span></code>.
411        To <code class="computeroutput"><span class="identifier">protect</span></code> a bind function
412        object from evaluation, use <code class="computeroutput"><span class="identifier">protect</span><span class="special">(</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...))</span></code>.
413      </p>
414</div>
415<div class="section">
416<div class="titlepage"><div><div><h3 class="title">
417<a name="bind.purpose.overloaded_operators_new_in_boos"></a><a class="link" href="bind.html#bind.purpose.overloaded_operators_new_in_boos" title="Overloaded operators (new in Boost 1.33)">Overloaded
418      operators (new in Boost 1.33)</a>
419</h3></div></div></div>
420<p>
421        For convenience, the function objects produced by <code class="computeroutput"><span class="identifier">bind</span></code>
422        overload the logical not operator <code class="computeroutput"><span class="special">!</span></code>
423        and the relational and logical operators <code class="computeroutput"><span class="special">==,</span>
424        <span class="special">!=,</span> <span class="special">&lt;,</span>
425        <span class="special">&lt;=,</span> <span class="special">&gt;,</span>
426        <span class="special">&gt;=,</span> <span class="special">&amp;&amp;,</span>
427        <span class="special">||</span></code>.
428      </p>
429<p>
430        <code class="computeroutput"><span class="special">!</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
431        <span class="special">...)</span></code> is equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">logical_not</span><span class="special">(),</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
432        <span class="special">...))</span></code>, where <code class="computeroutput"><span class="identifier">logical_not</span></code>
433        is a function object that takes one argument <code class="computeroutput"><span class="identifier">x</span></code>
434        and returns <code class="computeroutput"><span class="special">!</span><span class="identifier">x</span></code>.
435      </p>
436<p>
437        <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span>
438        <span class="identifier">op</span> <span class="identifier">x</span></code>,
439        where <span class="underline">op</span> is a relational or logical
440        operator, is equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">relation</span><span class="special">(),</span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
441        <span class="special">...),</span> <span class="identifier">x</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">relation</span></code>
442        is a function object that takes two arguments <code class="computeroutput"><span class="identifier">a</span></code>
443        and <code class="computeroutput"><span class="identifier">b</span></code> and returns <code class="computeroutput"><span class="identifier">a</span> <span class="identifier">op</span> <span class="identifier">b</span></code>.
444      </p>
445<p>
446        What this means in practice is that you can conveniently negate the result
447        of <code class="computeroutput"><span class="identifier">bind</span></code>:
448      </p>
449<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_if</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="special">!</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">visible</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">));</span> <span class="comment">// remove invisible objects</span>
450</pre>
451<p>
452        and compare the result of <code class="computeroutput"><span class="identifier">bind</span></code>
453        against a value:
454      </p>
455<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span> <span class="special">==</span> <span class="string">"Peter"</span><span class="special">);</span>
456<span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span> <span class="special">==</span> <span class="string">"Peter"</span> <span class="special">||</span> <span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span> <span class="special">==</span> <span class="string">"Paul"</span><span class="special">);</span>
457</pre>
458<p>
459        against a <span class="emphasis"><em>placeholder</em></span>:
460      </p>
461<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">_2</span>
462</pre>
463<p>
464        or against another <span class="emphasis"><em>bind expression</em></span>:
465      </p>
466<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">sort</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">));</span> <span class="comment">// sort by name</span>
467</pre>
468</div>
469</div>
470<div class="section">
471<div class="titlepage"><div><div><h2 class="title" style="clear: both">
472<a name="bind.examples"></a><a class="link" href="bind.html#bind.examples" title="Examples">Examples</a>
473</h2></div></div></div>
474<div class="section">
475<div class="titlepage"><div><div><h3 class="title">
476<a name="bind.examples.using_bind_with_standard_algorit"></a><a class="link" href="bind.html#bind.examples.using_bind_with_standard_algorit" title="Using bind with standard algorithms">Using
477      bind with standard algorithms</a>
478</h3></div></div></div>
479<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">image</span><span class="special">;</span>
480
481<span class="keyword">class</span> <span class="identifier">animation</span>
482<span class="special">{</span>
483<span class="keyword">public</span><span class="special">:</span>
484    <span class="keyword">void</span> <span class="identifier">advance</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">ms</span><span class="special">);</span>
485    <span class="keyword">bool</span> <span class="identifier">inactive</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
486    <span class="keyword">void</span> <span class="identifier">render</span><span class="special">(</span><span class="identifier">image</span> <span class="special">&amp;</span> <span class="identifier">target</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
487<span class="special">};</span>
488
489<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">animation</span><span class="special">&gt;</span> <span class="identifier">anims</span><span class="special">;</span>
490
491<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">P</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">erase_if</span><span class="special">(</span><span class="identifier">C</span> <span class="special">&amp;</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">P</span> <span class="identifier">pred</span><span class="special">)</span>
492<span class="special">{</span>
493    <span class="identifier">c</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">remove_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">pred</span><span class="special">),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
494<span class="special">}</span>
495
496<span class="keyword">void</span> <span class="identifier">update</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">ms</span><span class="special">)</span>
497<span class="special">{</span>
498    <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">anims</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">anims</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">animation</span><span class="special">::</span><span class="identifier">advance</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="identifier">ms</span><span class="special">));</span>
499    <span class="identifier">erase_if</span><span class="special">(</span><span class="identifier">anims</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span><span class="special">(&amp;</span><span class="identifier">animation</span><span class="special">::</span><span class="identifier">inactive</span><span class="special">));</span>
500<span class="special">}</span>
501
502<span class="keyword">void</span> <span class="identifier">render</span><span class="special">(</span><span class="identifier">image</span> <span class="special">&amp;</span> <span class="identifier">target</span><span class="special">)</span>
503<span class="special">{</span>
504    <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">anims</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">anims</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">animation</span><span class="special">::</span><span class="identifier">render</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">ref</span><span class="special">(</span><span class="identifier">target</span><span class="special">)));</span>
505<span class="special">}</span>
506</pre>
507</div>
508<div class="section">
509<div class="titlepage"><div><div><h3 class="title">
510<a name="bind.examples.using_bind_with_boost_function"></a><a class="link" href="bind.html#bind.examples.using_bind_with_boost_function" title="Using bind with Boost.Function">Using bind
511      with Boost.Function</a>
512</h3></div></div></div>
513<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">button</span>
514<span class="special">{</span>
515<span class="keyword">public</span><span class="special">:</span>
516    <a href="../../../../libs/function/index.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span></code></a><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span> <span class="identifier">onClick</span><span class="special">;</span>
517<span class="special">};</span>
518
519<span class="keyword">class</span> <span class="identifier">player</span>
520<span class="special">{</span>
521<span class="keyword">public</span><span class="special">:</span>
522    <span class="keyword">void</span> <span class="identifier">play</span><span class="special">();</span>
523    <span class="keyword">void</span> <span class="identifier">stop</span><span class="special">();</span>
524<span class="special">};</span>
525
526<span class="identifier">button</span> <span class="identifier">playButton</span><span class="special">,</span> <span class="identifier">stopButton</span><span class="special">;</span>
527<span class="identifier">player</span> <span class="identifier">thePlayer</span><span class="special">;</span>
528
529<span class="keyword">void</span> <span class="identifier">connect</span><span class="special">()</span>
530<span class="special">{</span>
531    <span class="identifier">playButton</span><span class="special">.</span><span class="identifier">onClick</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">player</span><span class="special">::</span><span class="identifier">play</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">thePlayer</span><span class="special">);</span>
532    <span class="identifier">stopButton</span><span class="special">.</span><span class="identifier">onClick</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">player</span><span class="special">::</span><span class="identifier">stop</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">thePlayer</span><span class="special">);</span>
533<span class="special">}</span>
534</pre>
535</div>
536</div>
537<div class="section">
538<div class="titlepage"><div><div><h2 class="title" style="clear: both">
539<a name="bind.limitations"></a><a class="link" href="bind.html#bind.limitations" title="Limitations">Limitations</a>
540</h2></div></div></div>
541<p>
542      As a general rule, the function objects generated by <code class="computeroutput"><span class="identifier">bind</span></code>
543      take their arguments by reference and cannot, therefore, accept non-const temporaries
544      or literal constants. This is an inherent limitation of the C++ language in
545      its current (2003) incarnation, known as the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_top">forwarding
546      problem</a>. (It will be fixed in the next standard, usually called C++0x.)
547    </p>
548<p>
549      The library uses signatures of the form
550    </p>
551<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
552</pre>
553<p>
554      to accept arguments of arbitrary types and pass them on unmodified. As noted,
555      this does not work with non-const r-values.
556    </p>
557<p>
558      On compilers that support partial ordering of function templates, a possible
559      solution is to add an overload:
560    </p>
561<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
562<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">t</span><span class="special">);</span>
563</pre>
564<p>
565      Unfortunately, this requires providing 512 overloads for nine arguments, which
566      is impractical. The library chooses a small subset: for up to two arguments,
567      it provides the const overloads in full, for arities of three and more it provides
568      a single additional overload with all of the arguments taken by const reference.
569      This covers a reasonable portion of the use cases.
570    </p>
571</div>
572<div class="section">
573<div class="titlepage"><div><div><h2 class="title" style="clear: both">
574<a name="bind.faq"></a><a class="link" href="bind.html#bind.faq" title="Frequently Asked Questions">Frequently Asked Questions</a>
575</h2></div></div></div>
576<div class="section">
577<div class="titlepage"><div><div><h3 class="title">
578<a name="bind.faq.why_doesn_t_this_compile"></a><a class="link" href="bind.html#bind.faq.why_doesn_t_this_compile" title="Why doesn't this compile?">Why doesn't this compile?</a>
579</h3></div></div></div>
580<p>
581        See the dedicated <a class="link" href="bind.html#bind.troubleshooting" title="Troubleshooting">Troubleshooting section</a>.
582      </p>
583</div>
584<div class="section">
585<div class="titlepage"><div><div><h3 class="title">
586<a name="bind.faq.why_does_this_compile_it_should_"></a><a class="link" href="bind.html#bind.faq.why_does_this_compile_it_should_" title="Why does this compile? It should not.">Why does this
587      compile? It should not.</a>
588</h3></div></div></div>
589<p>
590        Probably because you used the general <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
591        syntax, thereby instructing <code class="computeroutput"><span class="identifier">bind</span></code>
592        to not "inspect" f to detect arity and return type errors.
593      </p>
594</div>
595<div class="section">
596<div class="titlepage"><div><div><h3 class="title">
597<a name="bind.faq.Q_forms"></a><a class="link" href="bind.html#bind.faq.Q_forms" title="What is the difference between bind(f, ...) and bind&lt;R&gt;(f, ...)?">What is the difference between <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code> and
598      <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>?</a>
599</h3></div></div></div>
600<p>
601        The first form instructs <code class="computeroutput"><span class="identifier">bind</span></code>
602        to inspect the type of <code class="computeroutput"><span class="identifier">f</span></code>
603        in order to determine its arity (number of arguments) and return type. Arity
604        errors will be detected at "bind time". This syntax, of course,
605        places some requirements on <code class="computeroutput"><span class="identifier">f</span></code>.
606        It must be a function, function pointer, member function pointer, or a function
607        object that defines a nested type named <code class="computeroutput"><span class="identifier">result_type</span></code>;
608        in short, it must be something that <code class="computeroutput"><span class="identifier">bind</span></code>
609        can recognize.
610      </p>
611<p>
612        The second form instructs <code class="computeroutput"><span class="identifier">bind</span></code>
613        to not attempt to recognize the type of <code class="computeroutput"><span class="identifier">f</span></code>.
614        It is generally used with function objects that do not, or cannot, expose
615        <code class="computeroutput"><span class="identifier">result_type</span></code>, but it can also
616        be used with nonstandard functions. For example, the current implementation
617        does not automatically recognize variable-argument functions like <code class="computeroutput"><span class="identifier">printf</span></code>, so you will have to use <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">printf</span><span class="special">,</span> <span class="special">...)</span></code>. Note
618        that an alternative <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">type</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(),</span> <span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
619        syntax is supported for portability reasons.
620      </p>
621<p>
622        Another important factor to consider is that compilers without partial template
623        specialization or function template partial ordering support cannot handle
624        the first form when <code class="computeroutput"><span class="identifier">f</span></code> is
625        a function object, and in most cases will not handle the second form when
626        <code class="computeroutput"><span class="identifier">f</span></code> is a function (pointer)
627        or a member function pointer.
628      </p>
629</div>
630<div class="section">
631<div class="titlepage"><div><div><h3 class="title">
632<a name="bind.faq.does_bind_work_with_windows_api_"></a><a class="link" href="bind.html#bind.faq.does_bind_work_with_windows_api_" title="Does bind work with Windows API functions?">Does bind
633      work with Windows API functions?</a>
634</h3></div></div></div>
635<p>
636        Yes, if you <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support"><code class="computeroutput"><span class="preprocessor">#define</span>
637        <span class="identifier">BOOST_BIND_ENABLE_STDCALL</span></code></a>.
638        An alternative is to treat the function as a <a class="link" href="bind.html#bind.purpose.with_function_objects" title="Using bind with function objects">generic
639        function object</a> and use the <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
640        syntax.
641      </p>
642</div>
643<div class="section">
644<div class="titlepage"><div><div><h3 class="title">
645<a name="bind.faq.does_bind_work_with_com_methods"></a><a class="link" href="bind.html#bind.faq.does_bind_work_with_com_methods" title="Does bind work with COM methods?">Does bind work
646      with COM methods?</a>
647</h3></div></div></div>
648<p>
649        Yes, if you <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support"><code class="computeroutput"><span class="preprocessor">#define</span>
650        <span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code></a>.
651      </p>
652</div>
653<div class="section">
654<div class="titlepage"><div><div><h3 class="title">
655<a name="bind.faq.does_bind_work_with_mac_toolbox_"></a><a class="link" href="bind.html#bind.faq.does_bind_work_with_mac_toolbox_" title="Does bind work with Mac toolbox functions?">Does bind
656      work with Mac toolbox functions?</a>
657</h3></div></div></div>
658<p>
659        Yes, if you <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support"><code class="computeroutput"><span class="preprocessor">#define</span>
660        <span class="identifier">BOOST_BIND_ENABLE_PASCAL</span></code></a>.
661        An alternative is to treat the function as a <a class="link" href="bind.html#bind.purpose.with_function_objects" title="Using bind with function objects">generic
662        function object</a> and use the <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
663        syntax.
664      </p>
665</div>
666<div class="section">
667<div class="titlepage"><div><div><h3 class="title">
668<a name="bind.faq.does_bind_work_with_extern_c_fun"></a><a class="link" href="bind.html#bind.faq.does_bind_work_with_extern_c_fun" title='Does bind work with extern "C" functions?'>Does bind
669      work with extern "C" functions?</a>
670</h3></div></div></div>
671<p>
672        Sometimes. On some platforms, pointers to extern "C" functions
673        are equivalent to "ordinary" function pointers, so they work fine.
674        Other platforms treat them as different types. A platform-specific implementation
675        of <code class="computeroutput"><span class="identifier">bind</span></code> is expected to handle
676        the problem transparently; this implementation does not. As usual, the workaround
677        is to treat the function as a <a class="link" href="bind.html#bind.purpose.with_function_objects" title="Using bind with function objects">generic
678        function object</a> and use the <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
679        syntax.
680      </p>
681</div>
682<div class="section">
683<div class="titlepage"><div><div><h3 class="title">
684<a name="bind.faq.why_doesn_t_bind_automatically_r"></a><a class="link" href="bind.html#bind.faq.why_doesn_t_bind_automatically_r" title="Why doesn't bind automatically recognize nonstandard functions?">Why doesn't
685      bind automatically recognize nonstandard functions?</a>
686</h3></div></div></div>
687<p>
688        Non-portable extensions, in general, should default to off to prevent vendor
689        lock-in. Had the <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support">appropriate
690        macros</a> been defined automatically, you could have accidentally taken
691        advantage of them without realizing that your code is, perhaps, no longer
692        portable. In addition, some compilers have the option to make <code class="computeroutput"><span class="identifier">__stdcall</span></code> (<code class="computeroutput"><span class="identifier">__fastcall</span></code>)
693        their default calling convention, in which case no separate support would
694        be necessary.
695      </p>
696</div>
697</div>
698<div class="section">
699<div class="titlepage"><div><div><h2 class="title" style="clear: both">
700<a name="bind.troubleshooting"></a><a class="link" href="bind.html#bind.troubleshooting" title="Troubleshooting">Troubleshooting</a>
701</h2></div></div></div>
702<div class="section">
703<div class="titlepage"><div><div><h3 class="title">
704<a name="bind.troubleshooting.incorrect_number_of_arguments"></a><a class="link" href="bind.html#bind.troubleshooting.incorrect_number_of_arguments" title="Incorrect number of arguments">Incorrect
705      number of arguments</a>
706</h3></div></div></div>
707<p>
708        In a <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span>
709        <span class="special">...,</span> <span class="identifier">aN</span><span class="special">)</span></code> expression, the function object <code class="computeroutput"><span class="identifier">f</span></code> must be able to take exactly N arguments.
710        This error is normally detected at "bind time"; in other words,
711        the compilation error is reported on the line where <code class="computeroutput"><span class="identifier">bind</span><span class="special">()</span></code> is invoked:
712      </p>
713<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">);</span>
714
715<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
716<span class="special">{</span>
717    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>    <span class="comment">// error, f takes two arguments</span>
718    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span> <span class="comment">// OK</span>
719<span class="special">}</span>
720</pre>
721<p>
722        A common variation of this error is to forget that member functions have
723        an implicit "this" argument:
724      </p>
725<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
726<span class="special">{</span>
727    <span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
728<span class="special">}</span>
729
730<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
731<span class="special">{</span>
732    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>     <span class="comment">// error, X::f takes two arguments</span>
733    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// OK</span>
734<span class="special">}</span>
735</pre>
736</div>
737<div class="section">
738<div class="titlepage"><div><div><h3 class="title">
739<a name="bind.troubleshooting.the_function_object_cannot_be_ca"></a><a class="link" href="bind.html#bind.troubleshooting.the_function_object_cannot_be_ca" title="The function object cannot be called with the specified arguments">The
740      function object cannot be called with the specified arguments</a>
741</h3></div></div></div>
742<p>
743        As in normal function calls, the function object that is bound must be compatible
744        with the argument list. The incompatibility will usually be detected by the
745        compiler at "call time" and the result is typically an error in
746        <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code> on a line that looks like:
747      </p>
748<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">a</span><span class="special">[</span><span class="identifier">a1_</span><span class="special">],</span> <span class="identifier">a</span><span class="special">[</span><span class="identifier">a2_</span><span class="special">]);</span>
749</pre>
750<p>
751        An example of this kind of error:
752      </p>
753<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
754
755<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
756<span class="special">{</span>
757    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="string">"incompatible"</span><span class="special">);</span>      <span class="comment">// OK so far, no call</span>
758    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="string">"incompatible"</span><span class="special">)();</span>    <span class="comment">// error, "incompatible" is not an int</span>
759    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>                  <span class="comment">// OK</span>
760    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)(</span><span class="string">"incompatible"</span><span class="special">);</span>  <span class="comment">// error, "incompatible" is not an int</span>
761<span class="special">}</span>
762</pre>
763</div>
764<div class="section">
765<div class="titlepage"><div><div><h3 class="title">
766<a name="bind.troubleshooting.accessing_an_argument_that_does_"></a><a class="link" href="bind.html#bind.troubleshooting.accessing_an_argument_that_does_" title="Accessing an argument that does not exist">Accessing
767      an argument that does not exist</a>
768</h3></div></div></div>
769<p>
770        The placeholder <code class="computeroutput"><span class="identifier">_N</span></code> selects
771        the argument at position <code class="computeroutput"><span class="identifier">N</span></code>
772        from the argument list passed at "call time." Naturally, it is
773        an error to attempt to access beyond the end of this list:
774      </p>
775<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
776
777<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
778<span class="special">{</span>
779    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>                  <span class="comment">// OK</span>
780    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)();</span>                <span class="comment">// error, there is no argument number 1</span>
781<span class="special">}</span>
782</pre>
783<p>
784        The error is usually reported in <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code>, at
785        a line similar to:
786      </p>
787<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">a</span><span class="special">[</span><span class="identifier">a1_</span><span class="special">]);</span>
788</pre>
789<p>
790        When emulating <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind1st</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code>, a common mistake of this category is to
791        type <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">)</span></code>
792        instead of the correct <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span>
793        <span class="identifier">a</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)</span></code>.
794      </p>
795</div>
796<div class="section">
797<div class="titlepage"><div><div><h3 class="title">
798<a name="bind.troubleshooting.inappropriate_use_of_bind_f"></a><a class="link" href="bind.html#bind.troubleshooting.inappropriate_use_of_bind_f" title="Inappropriate use of bind(f, ...)">Inappropriate
799      use of <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code></a>
800</h3></div></div></div>
801<p>
802        The <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span>
803        <span class="special">...,</span> <span class="identifier">aN</span><span class="special">)</span></code> <a class="link" href="bind.html#bind.faq.Q_forms" title="What is the difference between bind(f, ...) and bind&lt;R&gt;(f, ...)?">form</a>
804        causes automatic recognition of the type of <code class="computeroutput"><span class="identifier">f</span></code>.
805        It will not work with arbitrary function objects; <code class="computeroutput"><span class="identifier">f</span></code>
806        must be a function or a member function pointer.
807      </p>
808<p>
809        It is possible to use this form with function objects that define <code class="computeroutput"><span class="identifier">result_type</span></code>, but only on compilers that
810        support partial specialization and partial ordering. In particular, MSVC
811        up to version 7.0 does not support this syntax for function objects.
812      </p>
813</div>
814<div class="section">
815<div class="titlepage"><div><div><h3 class="title">
816<a name="bind.troubleshooting.inappropriate_use_of_bind_r_f"></a><a class="link" href="bind.html#bind.troubleshooting.inappropriate_use_of_bind_r_f" title="Inappropriate use of bind&lt;R&gt;(f, ...)">Inappropriate
817      use of <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code></a>
818</h3></div></div></div>
819<p>
820        The <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span>
821        <span class="special">...,</span> <span class="identifier">aN</span><span class="special">)</span></code> <a class="link" href="bind.html#bind.faq.Q_forms" title="What is the difference between bind(f, ...) and bind&lt;R&gt;(f, ...)?">form</a>
822        supports arbitrary function objects.
823      </p>
824<p>
825        It is possible (but not recommended) to use this form with functions or member
826        function pointers, but only on compilers that support partial ordering. In
827        particular, MSVC up to version 7.0 does not fully support this syntax for
828        functions and member function pointers.
829      </p>
830</div>
831<div class="section">
832<div class="titlepage"><div><div><h3 class="title">
833<a name="bind.troubleshooting.binding_a_nonstandard_function"></a><a class="link" href="bind.html#bind.troubleshooting.binding_a_nonstandard_function" title="Binding a nonstandard function">Binding
834      a nonstandard function</a>
835</h3></div></div></div>
836<p>
837        By default, the <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span>
838        <span class="special">...,</span> <span class="identifier">aN</span><span class="special">)</span></code> <a class="link" href="bind.html#bind.faq.Q_forms" title="What is the difference between bind(f, ...) and bind&lt;R&gt;(f, ...)?">form</a>
839        recognizes "ordinary" C++ functions and function pointers. <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support">Functions that use a different calling
840        convention</a>, or variable-argument functions such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span></code>,
841        do not work. The general <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span>
842        <span class="special">...,</span> <span class="identifier">aN</span><span class="special">)</span></code> <a class="link" href="bind.html#bind.faq.Q_forms" title="What is the difference between bind(f, ...) and bind&lt;R&gt;(f, ...)?">form</a>
843        works with nonstandard functions.
844      </p>
845<p>
846        On some platforms, extern "C" functions, like <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">strcmp</span></code>,
847        are not recognized by the short form of <code class="computeroutput"><span class="identifier">bind</span></code>.
848      </p>
849<p>
850        See also <a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support"><code class="computeroutput"><span class="identifier">__stdcall</span></code>
851        and <code class="computeroutput"><span class="identifier">pascal</span></code> Support</a>.
852      </p>
853</div>
854<div class="section">
855<div class="titlepage"><div><div><h3 class="title">
856<a name="bind.troubleshooting.binding_an_overloaded_function"></a><a class="link" href="bind.html#bind.troubleshooting.binding_an_overloaded_function" title="Binding an overloaded function">Binding
857      an overloaded function</a>
858</h3></div></div></div>
859<p>
860        An attempt to bind an overloaded function usually results in an error, as
861        there is no way to tell which overload was meant to be bound. This is a common
862        problem with member functions with two overloads, const and non-const, as
863        in this simplified example:
864      </p>
865<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
866<span class="special">{</span>
867    <span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">();</span>
868    <span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
869<span class="special">};</span>
870
871<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
872<span class="special">{</span>
873    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
874<span class="special">}</span>
875</pre>
876<p>
877        The ambiguity can be resolved manually by casting the (member) function pointer
878        to the desired type:
879      </p>
880<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
881<span class="special">{</span>
882    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">(</span><span class="identifier">X</span><span class="special">::*)</span> <span class="special">()</span> <span class="keyword">const</span> <span class="special">&gt;(&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">),</span> <span class="identifier">_1</span><span class="special">);</span>
883<span class="special">}</span>
884</pre>
885<p>
886        Another, arguably more readable, alternative is to introduce a temporary
887        variable:
888      </p>
889<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
890<span class="special">{</span>
891    <span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">get</span><span class="special">)</span> <span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">get</span><span class="special">;</span>
892    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">get</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
893<span class="special">}</span>
894</pre>
895</div>
896<div class="section">
897<div class="titlepage"><div><div><h3 class="title">
898<a name="bind.troubleshooting.modeling_stl_function_object_con"></a><a class="link" href="bind.html#bind.troubleshooting.modeling_stl_function_object_con" title="Modeling STL function object concepts">Modeling
899      STL function object concepts</a>
900</h3></div></div></div>
901<p>
902        The function objects that are produced by <code class="computeroutput"><span class="identifier">bind</span></code>
903        do not model the STL <a href="https://boost.org/sgi/stl/UnaryFunction.html" target="_top"><span class="emphasis"><em>Unary
904        Function</em></span></a> or <a href="https://boost.org/sgi/stl/BinaryFunction.html" target="_top"><span class="emphasis"><em>Binary
905        Function</em></span></a> concepts, even when the function objects are
906        unary or binary operations, because the function object types are missing
907        public typedefs <code class="computeroutput"><span class="identifier">result_type</span></code>
908        and <code class="computeroutput"><span class="identifier">argument_type</span></code> or <code class="computeroutput"><span class="identifier">first_argument_type</span></code> and <code class="computeroutput"><span class="identifier">second_argument_type</span></code>.
909        In cases where these typedefs are desirable, however, the utility function
910        <code class="computeroutput"><span class="identifier">make_adaptable</span></code> can be used
911        to adapt unary and binary function objects to these concepts. This allows
912        unary and binary function objects resulting from <code class="computeroutput"><span class="identifier">bind</span></code>
913        to be combined with STL templates such as <a href="http://en.cppreference.com/w/cpp/utility/functional/unary_negate" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">unary_negate</span></code></a>
914        and <a href="http://en.cppreference.com/w/cpp/utility/functional/binary_negate" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">binary_negate</span></code></a>.
915      </p>
916<p>
917        The <code class="computeroutput"><span class="identifier">make_adaptable</span></code> function
918        is defined in <a href="../../../../boost/bind/make_adaptable.hpp" target="_top"><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">make_adaptable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code></a>,
919        which must be included explicitly in addition to <a href="../../../../boost/bind/bind.hpp" target="_top"><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code></a>:
920      </p>
921<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">make_adaptable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
922
923<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-type</em></span> <span class="identifier">make_adaptable</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
924
925<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-unary-functional-type</em></span> <span class="identifier">make_adaptable</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
926
927<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-binary-functional-type</em></span> <span class="identifier">make_adaptable</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
928
929<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A3</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-ternary-functional-type</em></span> <span class="identifier">make_adaptable</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
930
931<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A3</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A4</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-4-ary-functional-type</em></span> <span class="identifier">make_adaptable</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
932</pre>
933<p>
934        This example shows how to use <code class="computeroutput"><span class="identifier">make_adaptable</span></code>
935        to make a predicate for "is not a space":
936      </p>
937<pre class="programlisting"><span class="keyword">typedef</span> <span class="keyword">char</span> <span class="identifier">char_t</span><span class="special">;</span>
938<span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">loc</span><span class="special">(</span><span class="string">""</span><span class="special">);</span>
939<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype</span><span class="special">&lt;</span><span class="identifier">char_t</span><span class="special">&gt;&amp;</span> <span class="identifier">ct</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype</span><span class="special">&lt;</span><span class="identifier">char_t</span><span class="special">&gt;</span> <span class="special">&gt;(</span><span class="identifier">loc</span><span class="special">);</span>
940
941<span class="keyword">auto</span> <span class="identifier">isntspace</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">not1</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_adaptable</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,</span> <span class="identifier">char_t</span><span class="special">&gt;(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype</span><span class="special">&lt;</span><span class="identifier">char_t</span><span class="special">&gt;::</span><span class="identifier">is</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">ct</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype_base</span><span class="special">::</span><span class="identifier">space</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">)));</span>
942</pre>
943<p>
944        In this example, <code class="computeroutput"><span class="identifier">bind</span></code> creates
945        the "is a space" (unary) predicate. It is then passed to <code class="computeroutput"><span class="identifier">make_adaptable</span></code> so that a function object
946        modeling the <span class="emphasis"><em>Unary Function</em></span> concept can be created,
947        serving as the argument to <a href="http://en.cppreference.com/w/cpp/utility/functional/not1" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">not1</span></code></a>.
948      </p>
949</div>
950<div class="section">
951<div class="titlepage"><div><div><h3 class="title">
952<a name="bind.troubleshooting.const_in_signatures"></a><a class="link" href="bind.html#bind.troubleshooting.const_in_signatures" title="const in signatures"><code class="computeroutput"><span class="keyword">const</span></code> in signatures</a>
953</h3></div></div></div>
954<p>
955        Some compilers, including MSVC 6.0 and Borland C++ 5.5.1, have problems with
956        the top-level <code class="computeroutput"><span class="keyword">const</span></code> in function
957        signatures:
958      </p>
959<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">);</span>
960
961<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
962<span class="special">{</span>
963    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span>     <span class="comment">// error</span>
964<span class="special">}</span>
965</pre>
966<p>
967        Workaround: remove the <code class="computeroutput"><span class="keyword">const</span></code>
968        qualifier from the argument.
969      </p>
970</div>
971<div class="section">
972<div class="titlepage"><div><div><h3 class="title">
973<a name="bind.troubleshooting.msvc_specific_using_boost_bind"></a><a class="link" href="bind.html#bind.troubleshooting.msvc_specific_using_boost_bind" title="MSVC specific: using boost::bind;">MSVC
974      specific: <code class="computeroutput"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">;</span></code></a>
975</h3></div></div></div>
976<p>
977        On MSVC (up to version 7.0), when <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>
978        is brought into scope with an using declaration:
979      </p>
980<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">;</span>
981</pre>
982<p>
983        the syntax <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
984        does not work. Workaround: either use the qualified name, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>,
985        or use an using directive instead:
986      </p>
987<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
988</pre>
989</div>
990<div class="section">
991<div class="titlepage"><div><div><h3 class="title">
992<a name="bind.troubleshooting.msvc_specific_class_templates_sh"></a><a class="link" href="bind.html#bind.troubleshooting.msvc_specific_class_templates_sh" title="MSVC specific: class templates shadow function templates">MSVC
993      specific: class templates shadow function templates</a>
994</h3></div></div></div>
995<p>
996        On MSVC (up to version 7.0), a nested class template named <code class="computeroutput"><span class="identifier">bind</span></code> will shadow the function template
997        <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>, breaking the <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>syntax.
998        Unfortunately, some libraries contain nested class templates named <code class="computeroutput"><span class="identifier">bind</span></code> (ironically, such code is often an
999        MSVC specific workaround.)
1000      </p>
1001<p>
1002        The workaround is to use the alternative <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">type</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(),</span> <span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
1003        syntax.
1004      </p>
1005</div>
1006<div class="section">
1007<div class="titlepage"><div><div><h3 class="title">
1008<a name="bind.troubleshooting.msvc_specific_in_signatures_trea"></a><a class="link" href="bind.html#bind.troubleshooting.msvc_specific_in_signatures_trea" title="MSVC specific: ... in signatures treated as type">MSVC
1009      specific: <code class="computeroutput"><span class="special">...</span></code> in signatures treated
1010      as type</a>
1011</h3></div></div></div>
1012<p>
1013        MSVC (up to version 7.0) treats the ellipsis in a variable argument function
1014        (such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span></code>) as a type. Therefore, it will accept
1015        the (incorrect in the current implementation) form:
1016      </p>
1017<pre class="programlisting"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">printf</span><span class="special">,</span> <span class="string">"%s\n"</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
1018</pre>
1019<p>
1020        and will reject the correct version:
1021      </p>
1022<pre class="programlisting"><span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">printf</span><span class="special">,</span> <span class="string">"%s\n"</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
1023</pre>
1024</div>
1025</div>
1026<div class="section">
1027<div class="titlepage"><div><div><h2 class="title" style="clear: both">
1028<a name="bind.interface"></a><a class="link" href="bind.html#bind.interface" title="Interface">Interface</a>
1029</h2></div></div></div>
1030<div class="section">
1031<div class="titlepage"><div><div><h3 class="title">
1032<a name="bind.interface.synopsys"></a><a class="link" href="bind.html#bind.interface.synopsys" title="Synopsis">Synopsis</a>
1033</h3></div></div></div>
1034<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
1035<span class="special">{</span>
1036<span class="comment">// no arguments</span>
1037
1038<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-1</em></span> <a class="link" href="bind.html#bind_1"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
1039
1040<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-1-1</em></span> <a class="link" href="bind.html#bind_1_1"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
1041
1042<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-2</em></span> <a class="link" href="bind.html#bind_2"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">());</span>
1043
1044<span class="comment">// one argument</span>
1045
1046<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-3</em></span> <a class="link" href="bind.html#bind_3"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1047
1048<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-3-1</em></span> <a class="link" href="bind.html#bind_3_1"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1049
1050<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-4</em></span> <a class="link" href="bind.html#bind_4"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1051
1052<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-5</em></span> <a class="link" href="bind.html#bind_5"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1053
1054<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-6</em></span> <a class="link" href="bind.html#bind_6"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1055
1056<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-6-1</em></span> <a class="link" href="bind.html#bind_6_1"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span>
1057
1058<span class="comment">// two arguments</span>
1059
1060<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-7</em></span> <a class="link" href="bind.html#bind_7"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">);</span>
1061
1062<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-7-1</em></span> <a class="link" href="bind.html#bind_7_1"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">);</span>
1063
1064<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-8</em></span> <a class="link" href="bind.html#bind_8"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">,</span> <span class="identifier">B2</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">);</span>
1065
1066<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-9</em></span> <a class="link" href="bind.html#bind_9"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">);</span>
1067
1068<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-10</em></span> <a class="link" href="bind.html#bind_10"><code class="computeroutput"><span class="identifier">bind</span></code></a><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">)</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">);</span>
1069
1070<span class="comment">// implementation defined number of additional overloads for more arguments</span>
1071<span class="special">}</span>
1072
1073<span class="keyword">namespace</span>
1074<span class="special">{</span>
1075 <span class="emphasis"><em>unspecified-placeholder-type-1</em></span> <span class="identifier">_1</span><span class="special">;</span>
1076
1077 <span class="emphasis"><em>unspecified-placeholder-type-2</em></span> <span class="identifier">_2</span><span class="special">;</span>
1078
1079 <span class="emphasis"><em>unspecified-placeholder-type-3</em></span> <span class="identifier">_3</span><span class="special">;</span>
1080
1081<span class="comment">// implementation defined number of additional placeholder definitions</span>
1082<span class="special">}</span>
1083</pre>
1084</div>
1085<div class="section">
1086<div class="titlepage"><div><div><h3 class="title">
1087<a name="bind.interface.common_requirements"></a><a class="link" href="bind.html#bind.interface.common_requirements" title="Common requirements">Common requirements</a>
1088</h3></div></div></div>
1089<p>
1090        All <span class="emphasis"><em>unspecified-N</em></span> types returned by <code class="computeroutput"><span class="identifier">bind</span></code>
1091        are <span class="emphasis"><em>CopyConstructible</em></span>. <span class="emphasis"><em>unspecified-N</em></span><code class="computeroutput"><span class="special">::</span><span class="identifier">result_type</span></code>
1092        is defined as the return type of <span class="emphasis"><em>unspecified-N</em></span><code class="computeroutput"><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>.
1093      </p>
1094<p>
1095        All <span class="emphasis"><em>unspecified-placeholder-N</em></span> types are <span class="emphasis"><em>CopyConstructible</em></span>.
1096        Their copy constructors do not throw exceptions.
1097      </p>
1098</div>
1099<div class="section">
1100<div class="titlepage"><div><div><h3 class="title">
1101<a name="bind.interface.common_definitions"></a><a class="link" href="bind.html#bind.interface.common_definitions" title="Common definitions">Common definitions</a>
1102</h3></div></div></div>
1103<p>
1104        The function μ<code class="computeroutput"><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span>
1105        <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>, where <code class="computeroutput"><span class="identifier">m</span></code>
1106        is a nonnegative integer, is defined as:
1107      </p>
1108<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1109<li class="listitem">
1110            <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>,
1111            when <code class="computeroutput"><span class="identifier">x</span></code> is of type <a href="../../../../libs/core/doc/html/core/ref.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> for some type <code class="computeroutput"><span class="identifier">T</span></code>;
1112          </li>
1113<li class="listitem">
1114            <code class="computeroutput"><span class="identifier">vk</span></code>, when <code class="computeroutput"><span class="identifier">x</span></code> is (a copy of) the placeholder <span class="emphasis"><em>_k</em></span>
1115            for some positive integer <span class="emphasis"><em>k</em></span>;
1116          </li>
1117<li class="listitem">
1118            <code class="computeroutput"><span class="identifier">x</span><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code> when <code class="computeroutput"><span class="identifier">x</span></code>
1119            is (a copy of) a function object returned by <code class="computeroutput"><span class="identifier">bind</span></code>;
1120          </li>
1121<li class="listitem">
1122            <code class="computeroutput"><span class="identifier">x</span></code> otherwise.
1123          </li>
1124</ul></div>
1125</div>
1126<div class="section">
1127<div class="titlepage"><div><div><h3 class="title">
1128<a name="bind.interface.bind"></a><a class="link" href="bind.html#bind.interface.bind" title="bind"><code class="computeroutput"><span class="identifier">bind</span></code></a>
1129</h3></div></div></div>
1130<a name="bind_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-1</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
1131</pre>
1132<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1133<li class="listitem">
1134            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1135            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1136            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>,
1137            implicitly converted to <code class="computeroutput"><span class="identifier">R</span></code>.
1138          </li>
1139<li class="listitem">
1140            <span class="emphasis"><em>Throws:</em></span> Nothing unless the copy constructor of
1141            <code class="computeroutput"><span class="identifier">F</span></code> throws an exception.
1142          </li>
1143</ul></div>
1144<a name="bind_1_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-1-1</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
1145</pre>
1146<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1147<li class="listitem">
1148            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">typename</span>
1149            <span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span><span class="special">,</span>
1150            <span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)</span></code>.
1151          </li>
1152<li class="listitem">
1153            <span class="emphasis"><em>Notes:</em></span> Implementations are allowed to infer the
1154            return type of <code class="computeroutput"><span class="identifier">f</span></code> via
1155            other means as an extension, without relying on the <code class="computeroutput"><span class="identifier">result_type</span></code>
1156            member.
1157          </li>
1158</ul></div>
1159<a name="bind_2"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-2</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">())</span>
1160</pre>
1161<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1162<li class="listitem">
1163            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1164            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1165            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>.
1166          </li>
1167<li class="listitem">
1168            <span class="emphasis"><em>Throws:</em></span> Nothing.
1169          </li>
1170</ul></div>
1171<a name="bind_3"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-3</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1172</pre>
1173<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1174<li class="listitem">
1175            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1176            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1177            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span></code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">))</span></code>,
1178            implicitly converted to <code class="computeroutput"><span class="identifier">R</span></code>.
1179          </li>
1180<li class="listitem">
1181            <span class="emphasis"><em>Throws:</em></span> Nothing unless the copy constructors of
1182            <code class="computeroutput"><span class="identifier">F</span></code> or <code class="computeroutput"><span class="identifier">A1</span></code>
1183            throw an exception.
1184          </li>
1185</ul></div>
1186<a name="bind_3_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-3-1</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1187</pre>
1188<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1189<li class="listitem">
1190            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">typename</span>
1191            <span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span><span class="special">,</span>
1192            <span class="identifier">F</span><span class="special">,</span>
1193            <span class="identifier">A1</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">)</span></code>.
1194          </li>
1195<li class="listitem">
1196            <span class="emphasis"><em>Notes:</em></span> Implementations are allowed to infer the
1197            return type of <code class="computeroutput"><span class="identifier">f</span></code> via
1198            other means as an extension, without relying on the <code class="computeroutput"><span class="identifier">result_type</span></code>
1199            member.
1200          </li>
1201</ul></div>
1202<a name="bind_4"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-4</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1203</pre>
1204<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1205<li class="listitem">
1206            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1207            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1208            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span></code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">))</span></code>.
1209          </li>
1210<li class="listitem">
1211            <span class="emphasis"><em>Throws:</em></span> Nothing unless the copy constructor of
1212            <code class="computeroutput"><span class="identifier">A1</span></code> throws an exception.
1213          </li>
1214</ul></div>
1215<a name="bind_5"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-5</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1216</pre>
1217<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1218            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span></code><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a><code class="computeroutput"><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a1</span><span class="special">)</span></code>.
1219          </li></ul></div>
1220<a name="bind_6"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-6</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1221</pre>
1222<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1223            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span></code><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a><code class="computeroutput"><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a1</span><span class="special">)</span></code>.
1224          </li></ul></div>
1225<a name="bind_6_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-6-1</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
1226</pre>
1227<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1228            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span></code><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a><code class="computeroutput"><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a1</span><span class="special">)</span></code>.
1229          </li></ul></div>
1230<a name="bind_7"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-7</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">)</span>
1231</pre>
1232<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1233<li class="listitem">
1234            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1235            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1236            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span></code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">),</span> </code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a2</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">))</span></code>,
1237            implicitly converted to <code class="computeroutput"><span class="identifier">R</span></code>.
1238          </li>
1239<li class="listitem">
1240            <span class="emphasis"><em>Throws:</em></span> Nothing unless the copy constructors of
1241            <code class="computeroutput"><span class="identifier">F</span></code>, <code class="computeroutput"><span class="identifier">A1</span></code>
1242            or <code class="computeroutput"><span class="identifier">A2</span></code> throw an exception.
1243          </li>
1244</ul></div>
1245<a name="bind_7_1"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-7-1</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">)</span>
1246</pre>
1247<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1248<li class="listitem">
1249            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="keyword">typename</span>
1250            <span class="identifier">F</span><span class="special">::</span><span class="identifier">result_type</span><span class="special">,</span>
1251            <span class="identifier">F</span><span class="special">,</span>
1252            <span class="identifier">A1</span><span class="special">,</span>
1253            <span class="identifier">A2</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code>.
1254          </li>
1255<li class="listitem">
1256            <span class="emphasis"><em>Notes:</em></span> Implementations are allowed to infer the
1257            return type of <code class="computeroutput"><span class="identifier">f</span></code> via
1258            other means as an extension, without relying on the <code class="computeroutput"><span class="identifier">result_type</span></code>
1259            member.
1260          </li>
1261</ul></div>
1262<a name="bind_8"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-8</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">,</span> <span class="identifier">B2</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">)</span>
1263</pre>
1264<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1265<li class="listitem">
1266            <span class="emphasis"><em>Returns:</em></span> A function object λ such that the
1267            expression λ<code class="computeroutput"><span class="special">(</span><span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">)</span></code>
1268            is equivalent to <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span></code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">),</span> </code>μ<code class="computeroutput"><span class="special">(</span><span class="identifier">a2</span><span class="special">,</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">vm</span><span class="special">))</span></code>.
1269          </li>
1270<li class="listitem">
1271            <span class="emphasis"><em>Throws:</em></span> Nothing unless the copy constructors of
1272            <code class="computeroutput"><span class="identifier">A1</span></code> or <code class="computeroutput"><span class="identifier">A2</span></code>
1273            throw an exception.
1274          </li>
1275</ul></div>
1276<a name="bind_9"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-9</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">),</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">)</span>
1277</pre>
1278<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1279            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span></code><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a><code class="computeroutput"><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code>.
1280          </li></ul></div>
1281<a name="bind_10"></a><pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">B1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">&gt;</span> <span class="emphasis"><em>unspecified-10</em></span> <span class="identifier">bind</span><span class="special">(</span><span class="identifier">R</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span><span class="identifier">B1</span><span class="special">)</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">)</span>
1282</pre>
1283<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1284            <span class="emphasis"><em>Effects:</em></span> Equivalent to <code class="computeroutput"><span class="identifier">bind</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</span></code><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mem_fn</span></code></a><code class="computeroutput"><span class="special">(</span><span class="identifier">f</span><span class="special">),</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">)</span></code>.
1285          </li></ul></div>
1286</div>
1287<div class="section">
1288<div class="titlepage"><div><div><h3 class="title">
1289<a name="bind.interface.additional_overloads"></a><a class="link" href="bind.html#bind.interface.additional_overloads" title="Additional overloads">Additional overloads</a>
1290</h3></div></div></div>
1291<p>
1292        Implementations are allowed to provide additional <code class="computeroutput"><span class="identifier">bind</span></code>
1293        overloads in order to support more arguments or different function pointer
1294        variations.
1295      </p>
1296</div>
1297</div>
1298<div class="section">
1299<div class="titlepage"><div><div><h2 class="title" style="clear: both">
1300<a name="bind.implementation"></a><a class="link" href="bind.html#bind.implementation" title="Implementation">Implementation</a>
1301</h2></div></div></div>
1302<div class="section">
1303<div class="titlepage"><div><div><h3 class="title">
1304<a name="bind.implementation.files"></a><a class="link" href="bind.html#bind.implementation.files" title="Files">Files</a>
1305</h3></div></div></div>
1306<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1307<li class="listitem">
1308            <a href="../../../../boost/bind/bind.hpp" target="_top">boost/bind/bind.hpp</a>
1309            (main header)
1310          </li>
1311<li class="listitem">
1312            <a href="../../../../boost/bind/bind_cc.hpp" target="_top">boost/bind/bind_cc.hpp</a>
1313            (used by <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
1314          </li>
1315<li class="listitem">
1316            <a href="../../../../boost/bind/bind_mf_cc.hpp" target="_top">boost/bind/bind_mf_cc.hpp</a>
1317            (used by <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
1318          </li>
1319<li class="listitem">
1320            <a href="../../../../boost/bind/bind_template.hpp" target="_top">boost/bind/bind_template.hpp</a>
1321            (used by <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code>, do not include directly)
1322          </li>
1323<li class="listitem">
1324            <a href="../../../../boost/bind/arg.hpp" target="_top">boost/bind/arg.hpp</a>
1325            (defines the type of the placeholder arguments)
1326          </li>
1327<li class="listitem">
1328            <a href="../../../../boost/bind/placeholders.hpp" target="_top">boost/bind/placeholders.hpp</a>
1329            (defines the <code class="computeroutput"><span class="identifier">_1</span></code>, <code class="computeroutput"><span class="identifier">_2</span></code>, ... <code class="computeroutput"><span class="identifier">_9</span></code>
1330            placeholders)
1331          </li>
1332<li class="listitem">
1333            <a href="../../../../boost/bind/apply.hpp" target="_top">boost/bind/apply.hpp</a>
1334            (<code class="computeroutput"><span class="identifier">apply</span></code> helper function
1335            object)
1336          </li>
1337<li class="listitem">
1338            <a href="../../../../boost/bind/protect.hpp" target="_top">boost/bind/protect.hpp</a>
1339            (<code class="computeroutput"><span class="identifier">protect</span></code> helper function)
1340          </li>
1341<li class="listitem">
1342            <a href="../../../../boost/bind/make_adaptable.hpp" target="_top">boost/bind/make_adaptable.hpp</a>
1343            (<code class="computeroutput"><span class="identifier">make_adaptable</span></code> helper
1344            function)
1345          </li>
1346<li class="listitem">
1347            <a href="../../test/bind_test.cpp" target="_top">libs/bind/test/bind_test.cpp</a>
1348            (test)
1349          </li>
1350<li class="listitem">
1351            <a href="../../bind_as_compose.cpp" target="_top">libs/bind/bind_as_compose.cpp</a>
1352            (function composition example)
1353          </li>
1354<li class="listitem">
1355            <a href="../../bind_visitor.cpp" target="_top">libs/bind/bind_visitor.cpp</a>
1356            (visitor example)
1357          </li>
1358<li class="listitem">
1359            <a href="../../test/bind_stdcall_test.cpp" target="_top">libs/bind/test/bind_stdcall_test.cpp</a>
1360            (test with <code class="computeroutput"><span class="identifier">__stdcall</span></code>
1361            functions)
1362          </li>
1363<li class="listitem">
1364            <a href="../../test/bind_stdcall_mf_test.cpp" target="_top">libs/bind/test/bind_stdcall_mf_test.cpp</a>
1365            (test with <code class="computeroutput"><span class="identifier">__stdcall</span></code>
1366            member functions)
1367          </li>
1368<li class="listitem">
1369            <a href="../../test/bind_fastcall_test.cpp" target="_top">libs/bind/test/bind_fastcall_test.</a>
1370            (test with <code class="computeroutput"><span class="identifier">__fastcall</span></code>
1371            functions)
1372          </li>
1373<li class="listitem">
1374            <a href="../../test/bind_fastcall_mf_test.cpp" target="_top">libs/bind/test/bind_fastcall_mf_test.cpp</a>
1375            (test with <code class="computeroutput"><span class="identifier">__fastcall</span></code>
1376            member functions)
1377          </li>
1378</ul></div>
1379</div>
1380<div class="section">
1381<div class="titlepage"><div><div><h3 class="title">
1382<a name="bind.implementation.dependencies"></a><a class="link" href="bind.html#bind.implementation.dependencies" title="Dependencies">Dependencies</a>
1383</h3></div></div></div>
1384<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1385<li class="listitem">
1386            <a href="../../../../libs/config/config.htm" target="_top">Boost.Config</a>
1387          </li>
1388<li class="listitem">
1389            <a href="../../../../libs/core/doc/html/core/ref.html" target="_top">boost/ref.hpp</a>
1390          </li>
1391<li class="listitem">
1392            <a href="../../../../libs/bind/mem_fn.html" target="_top">boost/mem_fn.hpp</a>
1393          </li>
1394<li class="listitem">
1395            <a href="../../../../boost/type.hpp" target="_top">boost/type.hpp</a>
1396          </li>
1397</ul></div>
1398</div>
1399<div class="section">
1400<div class="titlepage"><div><div><h3 class="title">
1401<a name="bind.implementation.number_of_arguments"></a><a class="link" href="bind.html#bind.implementation.number_of_arguments" title="Number of Arguments">Number of Arguments</a>
1402</h3></div></div></div>
1403<p>
1404        This implementation supports function objects with up to nine arguments.
1405        This is an implementation detail, not an inherent limitation of the design.
1406      </p>
1407</div>
1408<div class="section">
1409<div class="titlepage"><div><div><h3 class="title">
1410<a name="bind.implementation.stdcall"></a><a class="link" href="bind.html#bind.implementation.stdcall" title="__stdcall, __cdecl, __fastcall, and pascal Support"><code class="computeroutput"><span class="identifier">__stdcall</span></code>,
1411      <code class="computeroutput"><span class="identifier">__cdecl</span></code>, <code class="computeroutput"><span class="identifier">__fastcall</span></code>,
1412      and <code class="computeroutput"><span class="identifier">pascal</span></code> Support</a>
1413</h3></div></div></div>
1414<p>
1415        Some platforms allow several types of (member) functions that differ by their
1416        calling convention (the rules by which the function is invoked: how are arguments
1417        passed, how is the return value handled, and who cleans up the stack - if
1418        any.)
1419      </p>
1420<p>
1421        For example, Windows API functions and COM interface member functions use
1422        a calling convention known as <code class="computeroutput"><span class="identifier">__stdcall</span></code>.
1423        Borland VCL components use <code class="computeroutput"><span class="identifier">__fastcall</span></code>.
1424        Mac toolbox functions use a <code class="computeroutput"><span class="identifier">pascal</span></code>
1425        calling convention.
1426      </p>
1427<p>
1428        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">__stdcall</span></code> functions, <code class="computeroutput"><span class="preprocessor">#define</span></code>
1429        the macro <code class="computeroutput"><span class="identifier">BOOST_BIND_ENABLE_STDCALL</span></code>
1430        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1431      </p>
1432<p>
1433        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">__stdcall</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_STDCALL</span></code>
1434        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1435      </p>
1436<p>
1437        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">__fastcall</span></code> functions, <code class="computeroutput"><span class="preprocessor">#define</span></code>
1438        the macro <code class="computeroutput"><span class="identifier">BOOST_BIND_ENABLE_FASTCALL</span></code>
1439        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1440      </p>
1441<p>
1442        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">__fastcall</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_FASTCALL</span></code>
1443        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1444      </p>
1445<p>
1446        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">pascal</span></code> functions, <code class="computeroutput"><span class="preprocessor">#define</span></code>
1447        the macro <code class="computeroutput"><span class="identifier">BOOST_BIND_ENABLE_PASCAL</span></code>
1448        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1449      </p>
1450<p>
1451        To use <code class="computeroutput"><span class="identifier">bind</span></code> with <code class="computeroutput"><span class="identifier">__cdecl</span></code> member functions, <code class="computeroutput"><span class="preprocessor">#define</span></code> the macro <code class="computeroutput"><span class="identifier">BOOST_MEM_FN_ENABLE_CDECL</span></code>
1452        before including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
1453      </p>
1454<p>
1455        <span class="bold"><strong>It is best to define these macros in the project options,
1456        via <code class="computeroutput"><span class="special">-</span><span class="identifier">D</span></code>
1457        on the command line, or as the first line in the translation unit (.cpp file)
1458        where <code class="computeroutput"><span class="identifier">bind</span></code> is used.</strong></span>
1459        Not following this rule can lead to obscure errors when a header includes
1460        <code class="computeroutput"><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span></code> before the macro has been defined.
1461      </p>
1462<p>
1463        <span class="emphasis"><em>[Note:</em></span> this is a non-portable extension. It is not part
1464        of the interface.<span class="emphasis"><em>]</em></span>
1465      </p>
1466<p>
1467        <span class="emphasis"><em>[Note:</em></span> Some compilers provide only minimal support for
1468        the <code class="computeroutput"><span class="identifier">__stdcall</span></code> keyword.<span class="emphasis"><em>]</em></span>
1469      </p>
1470</div>
1471<div class="section">
1472<div class="titlepage"><div><div><h3 class="title">
1473<a name="bind.implementation.visit_each_support"></a><a class="link" href="bind.html#bind.implementation.visit_each_support" title="visit_each support"><code class="computeroutput"><span class="identifier">visit_each</span></code> support</a>
1474</h3></div></div></div>
1475<p>
1476        Function objects returned by <code class="computeroutput"><span class="identifier">bind</span></code>
1477        support the experimental and undocumented, as of yet, <code class="computeroutput"><span class="identifier">visit_each</span></code>
1478        enumeration interface.
1479      </p>
1480<p>
1481        See <a href="../../bind_visitor.cpp" target="_top">bind_visitor.cpp</a> for an example.
1482      </p>
1483</div>
1484</div>
1485<div class="section">
1486<div class="titlepage"><div><div><h2 class="title" style="clear: both">
1487<a name="bind.acknowledgements"></a><a class="link" href="bind.html#bind.acknowledgements" title="Acknowledgements">Acknowledgements</a>
1488</h2></div></div></div>
1489<p>
1490      Earlier efforts that have influenced the library design:
1491    </p>
1492<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1493<li class="listitem">
1494          The <a href="http://staff.cs.utu.fi/BL/" target="_top">Binder Library</a> by Jaakko
1495          Järvi;
1496        </li>
1497<li class="listitem">
1498          The <a href="../../../../libs/lambda/index.html" target="_top">Lambda Library</a> (now
1499          part of Boost) by Jaakko Järvi and Gary Powell (the successor to the
1500          Binder Library);
1501        </li>
1502<li class="listitem">
1503          <a href="http://more.sourceforge.net/" target="_top">Extensions to the STL</a>
1504          by Petter Urkedal.
1505        </li>
1506</ul></div>
1507<p>
1508      Doug Gregor suggested that a visitor mechanism would allow <code class="computeroutput"><span class="identifier">bind</span></code>
1509      to interoperate with a signal/slot library.
1510    </p>
1511<p>
1512      John Maddock fixed a MSVC-specific conflict between <code class="computeroutput"><span class="identifier">bind</span></code>
1513      and the <a href="../../../../libs/type_traits/index.html" target="_top">type traits library</a>.
1514    </p>
1515<p>
1516      Numerous improvements were suggested during the formal review period by Ross
1517      Smith, Richard Crossley, Jens Maurer, Ed Brey, and others. Review manager was
1518      Darin Adler.
1519    </p>
1520<p>
1521      The precise semantics of <code class="computeroutput"><span class="identifier">bind</span></code>
1522      were refined in discussions with Jaakko Järvi.
1523    </p>
1524<p>
1525      Dave Abrahams fixed a MSVC-specific conflict between <code class="computeroutput"><span class="identifier">bind</span></code>
1526      and the <a href="../../../../libs/utility/iterator_adaptors.htm" target="_top">iterator adaptors
1527      library</a>.
1528    </p>
1529<p>
1530      Dave Abrahams modified <code class="computeroutput"><span class="identifier">bind</span></code>
1531      and <code class="computeroutput"><span class="identifier">mem_fn</span></code> to support <code class="computeroutput"><span class="keyword">void</span></code> returns on deficient compilers.
1532    </p>
1533<p>
1534      Mac Murrett contributed the "pascal" support enabled by <code class="computeroutput"><span class="identifier">BOOST_BIND_ENABLE_PASCAL</span></code>.
1535    </p>
1536<p>
1537      The alternative <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">type</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(),</span> <span class="identifier">f</span><span class="special">,</span> <span class="special">...)</span></code>
1538      syntax was inspired by a discussion with Dave Abrahams and Joel de Guzman.
1539    </p>
1540<p>
1541      This documentation was ported to Quickbook by Agustín Bergé.
1542    </p>
1543</div>
1544</div>
1545<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1546<td align="left"><p><small>Last revised: August 11, 2020 at 15:01:55 GMT</small></p></td>
1547<td align="right"><div class="copyright-footer"></div></td>
1548</tr></table>
1549<hr>
1550<div class="spirit-nav"></div>
1551</body>
1552</html>
1553