bind.html 171 KB

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