boost_python_make_function_hpp.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>boost/python/make_function.hpp</title>
  5. <link rel="stylesheet" href="../../boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Boost.Python Reference Manual">
  8. <link rel="up" href="../function_invocation_and_creation.html" title="Chapter&#160;4.&#160;Function Invocation and Creation">
  9. <link rel="prev" href="boost_python_data_members_hpp.html" title="boost/python/data_members.hpp">
  10. <link rel="next" href="boost_python_overloads_hpp.html" title="boost/python/overloads.hpp">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
  14. <hr>
  15. <div class="spirit-nav">
  16. <a accesskey="p" href="boost_python_data_members_hpp.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../function_invocation_and_creation.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="boost_python_overloads_hpp.html"><img src="../../images/next.png" alt="Next"></a>
  17. </div>
  18. <div class="section">
  19. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  20. <a name="function_invocation_and_creation.boost_python_make_function_hpp"></a><a class="link" href="boost_python_make_function_hpp.html" title="boost/python/make_function.hpp">boost/python/make_function.hpp</a>
  21. </h2></div></div></div>
  22. <div class="toc"><dl class="toc">
  23. <dt><span class="section"><a href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.introduction">Introduction</a></span></dt>
  24. <dt><span class="section"><a href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.functions">Functions</a></span></dt>
  25. <dt><span class="section"><a href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.example">Example</a></span></dt>
  26. </dl></div>
  27. <div class="section">
  28. <div class="titlepage"><div><div><h3 class="title">
  29. <a name="function_invocation_and_creation.boost_python_make_function_hpp.introduction"></a><a class="link" href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.introduction" title="Introduction">Introduction</a>
  30. </h3></div></div></div>
  31. <p>
  32. make_function() and make_constructor() are the functions used internally
  33. by def() and class_&lt;&gt;::def() to produce Python callable objects which
  34. wrap C++ functions and member functions.
  35. </p>
  36. </div>
  37. <div class="section">
  38. <div class="titlepage"><div><div><h3 class="title">
  39. <a name="function_invocation_and_creation.boost_python_make_function_hpp.functions"></a><a class="link" href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.functions" title="Functions">Functions</a>
  40. </h3></div></div></div>
  41. <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>
  42. <span class="identifier">object</span> <span class="identifier">make_function</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
  43. <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">Policies</span><span class="special">&gt;</span>
  44. <span class="identifier">object</span> <span class="identifier">make_function</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">)</span>
  45. <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">Policies</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">KeywordsOrSignature</span><span class="special">&gt;</span>
  46. <span class="identifier">object</span> <span class="identifier">make_function</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">,</span> <span class="identifier">KeywordsOrSignature</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">ks</span><span class="special">)</span>
  47. <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">Policies</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
  48. <span class="identifier">object</span> <span class="identifier">make_function</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">,</span> <span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">kw</span><span class="special">,</span> <span class="identifier">Signature</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">sig</span><span class="special">)</span>
  49. </pre>
  50. <div class="variablelist">
  51. <p class="title"><b></b></p>
  52. <dl class="variablelist">
  53. <dt><span class="term">Requires</span></dt>
  54. <dd><p>
  55. F is a function pointer or member function pointer type. If policies
  56. are supplied, it must be a model of CallPolicies. If kewords are
  57. supplied, it must be the result of a keyword-expression specifying
  58. no more arguments than the arity of f.
  59. </p></dd>
  60. <dt><span class="term">Effects</span></dt>
  61. <dd>
  62. <p>
  63. Creates a Python callable object which, when called from Python,
  64. converts its arguments to C++ and calls f. If F is a pointer-to-member-function
  65. type, the target object of the function call (*this) will be taken
  66. from the first Python argument, and subsequent Python arguments will
  67. be used as the arguments to f.
  68. </p>
  69. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  70. <li class="listitem">
  71. If policies are supplied, it will be applied to the function
  72. as described here.
  73. </li>
  74. <li class="listitem">
  75. If keywords are supplied, the keywords will be applied in order
  76. to the final arguments of the resulting function.
  77. </li>
  78. <li class="listitem">
  79. If Signature is supplied, it should be an instance of an MPL
  80. front-extensible sequence representing the function's return
  81. type followed by its argument types. Pass a Signature when wrapping
  82. function object types whose signatures can't be deduced, or when
  83. you wish to override the types which will be passed to the wrapped
  84. function.
  85. </li>
  86. </ul></div>
  87. </dd>
  88. <dt><span class="term">Returns</span></dt>
  89. <dd><p>
  90. An instance of object which holds the new Python callable object.
  91. </p></dd>
  92. <dt><span class="term">Caveats</span></dt>
  93. <dd><p>
  94. An argument of pointer type may be 0 if None is passed from Python.
  95. An argument type which is a constant reference may refer to a temporary
  96. which was created from the Python object for just the duration of
  97. the call to the wrapped function, for example a std::vector conjured
  98. up by the conversion process from a Python list. Use a non-const
  99. reference argument when a persistent lvalue is required.
  100. </p></dd>
  101. </dl>
  102. </div>
  103. <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>
  104. <span class="identifier">object</span> <span class="identifier">make_constructor</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
  105. <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">Policies</span><span class="special">&gt;</span>
  106. <span class="identifier">object</span> <span class="identifier">make_constructor</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">)</span>
  107. <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">Policies</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">KeywordsOrSignature</span><span class="special">&gt;</span>
  108. <span class="identifier">object</span> <span class="identifier">make_constructor</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">,</span> <span class="identifier">KeywordsOrSignature</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">ks</span><span class="special">)</span>
  109. <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">Policies</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Signature</span><span class="special">&gt;</span>
  110. <span class="identifier">object</span> <span class="identifier">make_constructor</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">policies</span><span class="special">,</span> <span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">kw</span><span class="special">,</span> <span class="identifier">Signature</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">sig</span><span class="special">)</span>
  111. </pre>
  112. <div class="variablelist">
  113. <p class="title"><b></b></p>
  114. <dl class="variablelist">
  115. <dt><span class="term">Requires</span></dt>
  116. <dd><p>
  117. F is a function pointer type. If policies are supplied, it must be
  118. a model of CallPolicies. If kewords are supplied, it must be the
  119. result of a keyword-expression specifying no more arguments than
  120. the arity of f.
  121. </p></dd>
  122. <dt><span class="term">Effects</span></dt>
  123. <dd><p>
  124. Creates a Python callable object which, when called from Python,
  125. converts its arguments to C++ and calls f.
  126. </p></dd>
  127. <dt><span class="term">Returns</span></dt>
  128. <dd><p>
  129. An instance of object which holds the new Python callable object.
  130. </p></dd>
  131. </dl>
  132. </div>
  133. </div>
  134. <div class="section">
  135. <div class="titlepage"><div><div><h3 class="title">
  136. <a name="function_invocation_and_creation.boost_python_make_function_hpp.example"></a><a class="link" href="boost_python_make_function_hpp.html#function_invocation_and_creation.boost_python_make_function_hpp.example" title="Example">Example</a>
  137. </h3></div></div></div>
  138. <p>
  139. C++ function exposed below returns a callable object wrapping one of two
  140. functions.
  141. </p>
  142. <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">python</span><span class="special">/</span><span class="identifier">make_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  143. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">python</span><span class="special">/</span><span class="identifier">module</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  144. <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">foo</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"foo"</span><span class="special">;</span> <span class="special">}</span>
  145. <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">bar</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"bar"</span><span class="special">;</span> <span class="special">}</span>
  146. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">;</span>
  147. <span class="identifier">object</span> <span class="identifier">choose_function</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">selector</span><span class="special">)</span>
  148. <span class="special">{</span>
  149. <span class="keyword">if</span> <span class="special">(</span><span class="identifier">selector</span><span class="special">)</span>
  150. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">make_function</span><span class="special">(</span><span class="identifier">foo</span><span class="special">);</span>
  151. <span class="keyword">else</span>
  152. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">make_function</span><span class="special">(</span><span class="identifier">bar</span><span class="special">);</span>
  153. <span class="special">}</span>
  154. <span class="identifier">BOOST_PYTHON_MODULE</span><span class="special">(</span><span class="identifier">make_function_test</span><span class="special">)</span>
  155. <span class="special">{</span>
  156. <span class="identifier">def</span><span class="special">(</span><span class="string">"choose_function"</span><span class="special">,</span> <span class="identifier">choose_function</span><span class="special">);</span>
  157. <span class="special">}</span>
  158. </pre>
  159. <p>
  160. It can be used this way in Python:
  161. </p>
  162. <pre class="programlisting"><span class="special">&gt;&gt;&gt;</span> <span class="identifier">from</span> <span class="identifier">make_function_test</span> <span class="identifier">import</span> <span class="special">*</span>
  163. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">choose_function</span><span class="special">(</span><span class="number">1</span><span class="special">)</span>
  164. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">g</span> <span class="special">=</span> <span class="identifier">choose_function</span><span class="special">(</span><span class="number">0</span><span class="special">)</span>
  165. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">f</span><span class="special">()</span>
  166. <span class="char">'foo'</span>
  167. <span class="special">&gt;&gt;&gt;</span> <span class="identifier">g</span><span class="special">()</span>
  168. <span class="char">'bar'</span>
  169. </pre>
  170. </div>
  171. </div>
  172. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  173. <td align="left"></td>
  174. <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
  175. Distributed under the Boost Software License, Version 1.0. (See accompanying
  176. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>
  177. </p>
  178. </div></td>
  179. </tr></table>
  180. <hr>
  181. <div class="spirit-nav">
  182. <a accesskey="p" href="boost_python_data_members_hpp.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../function_invocation_and_creation.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="boost_python_overloads_hpp.html"><img src="../../images/next.png" alt="Next"></a>
  183. </div>
  184. </body>
  185. </html>