]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
3 | <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> | |
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.78.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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="keyword">int</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="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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="keyword">int</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="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"><</span><span class="keyword">int</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">x</span><span class="special">);</span> <span class="comment">// x < 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">(&</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"><</span><span class="identifier">R</span><span class="special">>(</span><a href="../../../../libs/bind/mem_fn.html" target="_top"><code class="computeroutput"><span class="identifier">mem_fn</span></code></a><span class="special">(&</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"><</span><span class="identifier">X</span><span class="special">></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">(&</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">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</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> | |
331 | <span class="identifier">bind</span><span class="special">(&</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">(&</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)->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">(&</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">(&</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/shared_ptr.htm" 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"><</span><span class="identifier">pf</span><span class="special">></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"><</span><span class="identifier">pf</span><span class="special">></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"><</span><span class="keyword">void</span><span class="special">>(),</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"><,</span> | |
425 | <span class="special"><=,</span> <span class="special">>,</span> | |
426 | <span class="special">>=,</span> <span class="special">&&,</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">(&</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">(&</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">(&</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">(&</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">(&</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">(&</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">bind</span><span class="special">(&</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">&</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"><</span><span class="identifier">animation</span><span class="special">></span> <span class="identifier">anims</span><span class="special">;</span> | |
490 | ||
491 | <span class="keyword">template</span><span class="special"><</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">></span> <span class="keyword">void</span> <span class="identifier">erase_if</span><span class="special">(</span><span class="identifier">C</span> <span class="special">&</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">(&</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">(&</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">&</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">(&</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"><</span><span class="keyword">void</span><span class="special">()></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">(&</span><span class="identifier">player</span><span class="special">::</span><span class="identifier">play</span><span class="special">,</span> <span class="special">&</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">(&</span><span class="identifier">player</span><span class="special">::</span><span class="identifier">stop</span><span class="special">,</span> <span class="special">&</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"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</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"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">t</span><span class="special">);</span> | |
562 | <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</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"><</span><span class="identifier">R</span><span class="special">>(</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<R>(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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="keyword">int</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(),</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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(</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">(&</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">(&</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<R>(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<R>(f, ...)">Inappropriate | |
817 | use of <code class="computeroutput"><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></code></a> | |
818 | </h3></div></div></div> | |
819 | <p> | |
820 | The <code class="computeroutput"><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="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<R>(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<R>(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"><</span><span class="identifier">R</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> | |
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<R>(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">&</span> <span class="identifier">get</span><span class="special">();</span> | |
868 | <span class="keyword">int</span> <span class="keyword">const</span><span class="special">&</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">(&</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"><</span> <span class="keyword">int</span> <span class="keyword">const</span><span class="special">&</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">>(&</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">&</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">&</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="http://www.sgi.com/tech/stl/UnaryFunction.html" target="_top"><span class="emphasis"><em>Unary | |
904 | Function</em></span></a> or <a href="http://www.sgi.com/tech/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"><</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">></span></code></a>, | |
919 | which must be included explicitly in addition to <a href="../../../../boost/bind.hpp" target="_top"><code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>: | |
920 | </p> | |
921 | <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span> | |
922 | ||
923 | <span class="keyword">template</span> <span class="special"><</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="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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</span><span class="identifier">char_t</span><span class="special">>&</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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype</span><span class="special"><</span><span class="identifier">char_t</span><span class="special">></span> <span class="special">>(</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"><</span><span class="keyword">bool</span><span class="special">,</span> <span class="identifier">char_t</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ctype</span><span class="special"><</span><span class="identifier">char_t</span><span class="special">>::</span><span class="identifier">is</span><span class="special">,</span> <span class="special">&</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">boostbind</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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(</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"><</span><span class="identifier">R</span><span class="special">>(),</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"><</span><span class="keyword">int</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> | |
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"><</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="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"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></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"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">></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"><</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="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"><</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="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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</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">></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"><</span><span class="identifier">T</span><span class="special">></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"><</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="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"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></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"><</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">>(</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"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">></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"><</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="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"><</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="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"><</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">>(</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"><</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">></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"><</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">></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"><</span><span class="identifier">R</span><span class="special">>(</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"><</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">></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"><</span><span class="identifier">R</span><span class="special">>(</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"><</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">></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"><</span><span class="identifier">R</span><span class="special">>(</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"><</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">></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"><</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">></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"><</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">>(</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"><</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">></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"><</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">></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"><</span><span class="identifier">R</span><span class="special">>(</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"><</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">></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"><</span><span class="identifier">R</span><span class="special">>(</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.hpp" target="_top">boost/bind.hpp</a> (main | |
1309 | 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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">R</span><span class="special">>(),</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: June 06, 2015 at 16:07:44 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> |