• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Functions</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 Tutorial">
8<link rel="up" href="../index.html" title="Boost.Python Tutorial">
9<link rel="prev" href="exposing.html" title="Exposing Classes">
10<link rel="next" href="object.html" title="Object Interface">
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="exposing.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="object.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="tutorial.functions"></a><a class="link" href="functions.html" title="Functions">Functions</a>
21</h2></div></div></div>
22<div class="toc"><dl class="toc">
23<dt><span class="section"><a href="functions.html#tutorial.functions.call_policies">Call Policies</a></span></dt>
24<dt><span class="section"><a href="functions.html#tutorial.functions.overloading">Overloading</a></span></dt>
25<dt><span class="section"><a href="functions.html#tutorial.functions.default_arguments">Default Arguments</a></span></dt>
26<dt><span class="section"><a href="functions.html#tutorial.functions.auto_overloading">Auto-Overloading</a></span></dt>
27</dl></div>
28<p>
29      In this chapter, we'll look at Boost.Python powered functions in closer detail.
30      We will see some facilities to make exposing C++ functions to Python safe from
31      potential pifalls such as dangling pointers and references. We will also see
32      facilities that will make it even easier for us to expose C++ functions that
33      take advantage of C++ features such as overloading and default arguments.
34    </p>
35<div class="blockquote"><blockquote class="blockquote"><p>
36        <span class="emphasis"><em>Read on...</em></span>
37      </p></blockquote></div>
38<p>
39      But before you do, you might want to fire up Python 2.2 or later and type
40      <code class="literal">&gt;&gt;&gt; import this</code>.
41    </p>
42<pre class="programlisting">&gt;&gt;&gt; import this
43The Zen of Python, by Tim Peters
44Beautiful is better than ugly.
45Explicit is better than implicit.
46Simple is better than complex.
47Complex is better than complicated.
48Flat is better than nested.
49Sparse is better than dense.
50Readability counts.
51Special cases aren't special enough to break the rules.
52Although practicality beats purity.
53Errors should never pass silently.
54Unless explicitly silenced.
55In the face of ambiguity, refuse the temptation to guess.
56There should be one-- and preferably only one --obvious way to do it
57Although that way may not be obvious at first unless you're Dutch.
58Now is better than never.
59Although never is often better than <span class="bold"><strong>right</strong></span> now.
60If the implementation is hard to explain, it's a bad idea.
61If the implementation is easy to explain, it may be a good idea.
62Namespaces are one honking great idea -- let's do more of those!
63</pre>
64<div class="section">
65<div class="titlepage"><div><div><h3 class="title">
66<a name="tutorial.functions.call_policies"></a><a class="link" href="functions.html#tutorial.functions.call_policies" title="Call Policies">Call Policies</a>
67</h3></div></div></div>
68<p>
69        In C++, we often deal with arguments and return types such as pointers and
70        references. Such primitive types are rather, ummmm, low level and they really
71        don't tell us much. At the very least, we don't know the owner of the pointer
72        or the referenced object. No wonder languages such as Java and Python never
73        deal with such low level entities. In C++, it's usually considered a good
74        practice to use smart pointers which exactly describe ownership semantics.
75        Still, even good C++ interfaces use raw references and pointers sometimes,
76        so Boost.Python must deal with them. To do this, it may need your help. Consider
77        the following C++ function:
78      </p>
79<pre class="programlisting"><span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">Y</span><span class="special">&amp;</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">Z</span><span class="special">*</span> <span class="identifier">z</span><span class="special">);</span>
80</pre>
81<p>
82        How should the library wrap this function? A naive approach builds a Python
83        X object around result reference. This strategy might or might not work out.
84        Here's an example where it didn't
85      </p>
86<pre class="programlisting"><span class="special">&gt;&gt;&gt;</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">f</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="special">#</span> <span class="identifier">x</span> <span class="identifier">refers</span> <span class="identifier">to</span> <span class="identifier">some</span> <span class="identifier">C</span><span class="special">++</span> <span class="identifier">X</span>
87<span class="special">&gt;&gt;&gt;</span> <span class="identifier">del</span> <span class="identifier">y</span>
88<span class="special">&gt;&gt;&gt;</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">some_method</span><span class="special">()</span> <span class="special">#</span> <span class="identifier">CRASH</span><span class="special">!</span>
89</pre>
90<p>
91        What's the problem?
92      </p>
93<p>
94        Well, what if f() was implemented as shown below:
95      </p>
96<pre class="programlisting"><span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">Y</span><span class="special">&amp;</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">Z</span><span class="special">*</span> <span class="identifier">z</span><span class="special">)</span>
97<span class="special">{</span>
98    <span class="identifier">y</span><span class="special">.</span><span class="identifier">z</span> <span class="special">=</span> <span class="identifier">z</span><span class="special">;</span>
99    <span class="keyword">return</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">x</span><span class="special">;</span>
100<span class="special">}</span>
101</pre>
102<p>
103        The problem is that the lifetime of result X&amp; is tied to the lifetime
104        of y, because the f() returns a reference to a member of the y object. This
105        idiom is is not uncommon and perfectly acceptable in the context of C++.
106        However, Python users should not be able to crash the system just by using
107        our C++ interface. In this case deleting y will invalidate the reference
108        to X. We have a dangling reference.
109      </p>
110<p>
111        Here's what's happening:
112      </p>
113<div class="orderedlist"><ol class="orderedlist" type="1">
114<li class="listitem">
115            <code class="literal">f</code> is called passing in a reference to <code class="literal">y</code>
116            and a pointer to <code class="literal">z</code>
117          </li>
118<li class="listitem">
119            A reference to <code class="literal">y.x</code> is returned
120          </li>
121<li class="listitem">
122            <code class="literal">y</code> is deleted. <code class="literal">x</code> is a dangling reference
123          </li>
124<li class="listitem">
125            <code class="literal">x.some_method()</code> is called
126          </li>
127<li class="listitem">
128            <span class="bold"><strong>BOOM!</strong></span>
129          </li>
130</ol></div>
131<p>
132        We could copy result into a new object:
133      </p>
134<pre class="programlisting"><span class="special">&gt;&gt;&gt;</span> <span class="identifier">f</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="identifier">set</span><span class="special">(</span><span class="number">42</span><span class="special">)</span> <span class="comment"># Result disappears</span>
135<span class="special">&gt;&gt;&gt;</span> <span class="identifier">y</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="comment"># No crash, but still bad</span>
136<span class="number">3.14</span>
137</pre>
138<p>
139        This is not really our intent of our C++ interface. We've broken our promise
140        that the Python interface should reflect the C++ interface as closely as
141        possible.
142      </p>
143<p>
144        Our problems do not end there. Suppose Y is implemented as follows:
145      </p>
146<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Y</span>
147<span class="special">{</span>
148    <span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span> <span class="identifier">Z</span><span class="special">*</span> <span class="identifier">z</span><span class="special">;</span>
149    <span class="keyword">int</span> <span class="identifier">z_value</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">z</span><span class="special">-&gt;</span><span class="identifier">value</span><span class="special">();</span> <span class="special">}</span>
150<span class="special">};</span>
151</pre>
152<p>
153        Notice that the data member <code class="literal">z</code> is held by class Y using
154        a raw pointer. Now we have a potential dangling pointer problem inside Y:
155      </p>
156<pre class="programlisting"><span class="special">&gt;&gt;&gt;</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">f</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="special">#</span> <span class="identifier">y</span> <span class="identifier">refers</span> <span class="identifier">to</span> <span class="identifier">z</span>
157<span class="special">&gt;&gt;&gt;</span> <span class="identifier">del</span> <span class="identifier">z</span>       <span class="special">#</span> <span class="identifier">Kill</span> <span class="identifier">the</span> <span class="identifier">z</span> <span class="identifier">object</span>
158<span class="special">&gt;&gt;&gt;</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">z_value</span><span class="special">()</span> <span class="special">#</span> <span class="identifier">CRASH</span><span class="special">!</span>
159</pre>
160<p>
161        For reference, here's the implementation of <code class="literal">f</code> again:
162      </p>
163<pre class="programlisting"><span class="identifier">X</span><span class="special">&amp;</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">Y</span><span class="special">&amp;</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">Z</span><span class="special">*</span> <span class="identifier">z</span><span class="special">)</span>
164<span class="special">{</span>
165    <span class="identifier">y</span><span class="special">.</span><span class="identifier">z</span> <span class="special">=</span> <span class="identifier">z</span><span class="special">;</span>
166    <span class="keyword">return</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">x</span><span class="special">;</span>
167<span class="special">}</span>
168</pre>
169<p>
170        Here's what's happening:
171      </p>
172<div class="orderedlist"><ol class="orderedlist" type="1">
173<li class="listitem">
174            <code class="literal">f</code> is called passing in a reference to <code class="literal">y</code>
175            and a pointer to <code class="literal">z</code>
176          </li>
177<li class="listitem">
178            A pointer to <code class="literal">z</code> is held by <code class="literal">y</code>
179          </li>
180<li class="listitem">
181            A reference to <code class="literal">y.x</code> is returned
182          </li>
183<li class="listitem">
184            <code class="literal">z</code> is deleted. <code class="literal">y.z</code> is a dangling
185            pointer
186          </li>
187<li class="listitem">
188            <code class="literal">y.z_value()</code> is called
189          </li>
190<li class="listitem">
191            <code class="literal">z-&gt;value()</code> is called
192          </li>
193<li class="listitem">
194            <span class="bold"><strong>BOOM!</strong></span>
195          </li>
196</ol></div>
197<h3>
198<a name="tutorial.functions.call_policies.h0"></a>
199        <span class="phrase"><a name="tutorial.functions.call_policies.call_policies"></a></span><a class="link" href="functions.html#tutorial.functions.call_policies.call_policies">Call
200        Policies</a>
201      </h3>
202<p>
203        Call Policies may be used in situations such as the example detailed above.
204        In our example, <code class="literal">return_internal_reference</code> and <code class="literal">with_custodian_and_ward</code>
205        are our friends:
206      </p>
207<pre class="programlisting"><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">f</span><span class="special">,</span>
208    <span class="identifier">return_internal_reference</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span>
209        <span class="identifier">with_custodian_and_ward</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;());</span>
210</pre>
211<p>
212        What are the <code class="literal">1</code> and <code class="literal">2</code> parameters, you
213        ask?
214      </p>
215<pre class="programlisting"><span class="identifier">return_internal_reference</span><span class="special">&lt;</span><span class="number">1</span>
216</pre>
217<p>
218        Informs Boost.Python that the first argument, in our case <code class="literal">Y&amp;
219        y</code>, is the owner of the returned reference: <code class="literal">X&amp;</code>.
220        The "<code class="literal">1</code>" simply specifies the first argument.
221        In short: "return an internal reference <code class="literal">X&amp;</code> owned
222        by the 1st argument <code class="literal">Y&amp; y</code>".
223      </p>
224<pre class="programlisting"><span class="identifier">with_custodian_and_ward</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span>
225</pre>
226<p>
227        Informs Boost.Python that the lifetime of the argument indicated by ward
228        (i.e. the 2nd argument: <code class="literal">Z* z</code>) is dependent on the lifetime
229        of the argument indicated by custodian (i.e. the 1st argument: <code class="literal">Y&amp;
230        y</code>).
231      </p>
232<p>
233        It is also important to note that we have defined two policies above. Two
234        or more policies can be composed by chaining. Here's the general syntax:
235      </p>
236<pre class="programlisting"><span class="identifier">policy1</span><span class="special">&lt;</span><span class="identifier">args</span><span class="special">...,</span>
237    <span class="identifier">policy2</span><span class="special">&lt;</span><span class="identifier">args</span><span class="special">...,</span>
238        <span class="identifier">policy3</span><span class="special">&lt;</span><span class="identifier">args</span><span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
239</pre>
240<p>
241        Here is the list of predefined call policies. A complete reference detailing
242        these can be found <a href="../../reference/function_invocation_and_creation/models_of_callpolicies.html" target="_top">here</a>.
243      </p>
244<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
245<li class="listitem">
246            <span class="bold"><strong>with_custodian_and_ward</strong></span>: Ties lifetimes
247            of the arguments
248          </li>
249<li class="listitem">
250            <span class="bold"><strong>with_custodian_and_ward_postcall</strong></span>: Ties
251            lifetimes of the arguments and results
252          </li>
253<li class="listitem">
254            <span class="bold"><strong>return_internal_reference</strong></span>: Ties lifetime
255            of one argument to that of result
256          </li>
257<li class="listitem">
258            <span class="bold"><strong>return_value_policy&lt;T&gt; with T one of:</strong></span>
259            <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
260<li class="listitem">
261                  <span class="bold"><strong>reference_existing_object</strong></span>: naive
262                  (dangerous) approach
263                </li>
264<li class="listitem">
265                  <span class="bold"><strong>copy_const_reference</strong></span>: Boost.Python
266                  v1 approach
267                </li>
268<li class="listitem">
269                  <span class="bold"><strong>copy_non_const_reference</strong></span>:
270                </li>
271<li class="listitem">
272                  <span class="bold"><strong>manage_new_object</strong></span>: Adopt a pointer
273                  and hold the instance
274                </li>
275</ul></div>
276          </li>
277</ul></div>
278<div class="blurb">
279<div class="titlepage"><div><div><p class="title"><b></b></p></div></div></div>
280<p>
281        <span class="inlinemediaobject"><img src="../../images/smiley.png"></span>
282        <span class="bold"><strong>Remember the Zen, Luke:</strong></span>
283      </p>
284<p>
285        "Explicit is better than implicit"
286      </p>
287<p>
288        "In the face of ambiguity, refuse the temptation to guess"
289      </p>
290</div>
291</div>
292<div class="section">
293<div class="titlepage"><div><div><h3 class="title">
294<a name="tutorial.functions.overloading"></a><a class="link" href="functions.html#tutorial.functions.overloading" title="Overloading">Overloading</a>
295</h3></div></div></div>
296<p>
297        The following illustrates a scheme for manually wrapping an overloaded member
298        functions. Of course, the same technique can be applied to wrapping overloaded
299        non-member functions.
300      </p>
301<p>
302        We have here our C++ class:
303      </p>
304<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
305<span class="special">{</span>
306    <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>
307    <span class="special">{</span>
308        <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
309    <span class="special">}</span>
310
311    <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> <span class="keyword">double</span> <span class="identifier">b</span><span class="special">)</span>
312    <span class="special">{</span>
313        <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
314    <span class="special">}</span>
315
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> <span class="keyword">double</span> <span class="identifier">b</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">)</span>
317    <span class="special">{</span>
318        <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
319    <span class="special">}</span>
320
321    <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> <span class="keyword">int</span> <span class="identifier">c</span><span class="special">)</span>
322    <span class="special">{</span>
323        <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>
324    <span class="special">};</span>
325<span class="special">};</span>
326</pre>
327<p>
328        Class X has 4 overloaded functions. We will start by introducing some member
329        function pointer variables:
330      </p>
331<pre class="programlisting"><span class="keyword">bool</span>    <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx1</span><span class="special">)(</span><span class="keyword">int</span><span class="special">)</span>              <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
332<span class="keyword">bool</span>    <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx2</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">)</span>      <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
333<span class="keyword">bool</span>    <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx3</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">char</span><span class="special">)=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
334<span class="keyword">int</span>     <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx4</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)</span>    <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
335</pre>
336<p>
337        With these in hand, we can proceed to define and wrap this for Python:
338      </p>
339<pre class="programlisting"><span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx1</span><span class="special">)</span>
340<span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx2</span><span class="special">)</span>
341<span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx3</span><span class="special">)</span>
342<span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx4</span><span class="special">)</span>
343</pre>
344</div>
345<div class="section">
346<div class="titlepage"><div><div><h3 class="title">
347<a name="tutorial.functions.default_arguments"></a><a class="link" href="functions.html#tutorial.functions.default_arguments" title="Default Arguments">Default Arguments</a>
348</h3></div></div></div>
349<p>
350        Boost.Python wraps (member) function pointers. Unfortunately, C++ function
351        pointers carry no default argument info. Take a function <code class="literal">f</code>
352        with default arguments:
353      </p>
354<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">double</span> <span class="special">=</span> <span class="number">3.14</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="special">=</span> <span class="string">"hello"</span><span class="special">);</span>
355</pre>
356<p>
357        But the type of a pointer to the function <code class="literal">f</code> has no information
358        about its default arguments:
359      </p>
360<pre class="programlisting"><span class="keyword">int</span><span class="special">(*</span><span class="identifier">g</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="special">=</span> <span class="identifier">f</span><span class="special">;</span>    <span class="comment">// defaults lost!</span>
361</pre>
362<p>
363        When we pass this function pointer to the <code class="literal">def</code> function,
364        there is no way to retrieve the default arguments:
365      </p>
366<pre class="programlisting"><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">f</span><span class="special">);</span>                            <span class="comment">// defaults lost!</span>
367</pre>
368<p>
369        Because of this, when wrapping C++ code, we had to resort to manual wrapping
370        as outlined in the <a class="link" href="functions.html#tutorial.functions.overloading" title="Overloading">previous
371        section</a>, or writing thin wrappers:
372      </p>
373<pre class="programlisting"><span class="comment">// write "thin wrappers"</span>
374<span class="keyword">int</span> <span class="identifier">f1</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="keyword">return</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span> <span class="special">}</span>
375<span class="keyword">int</span> <span class="identifier">f2</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">f</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="special">}</span>
376
377<span class="comment">/*...*/</span>
378
379    <span class="comment">// in module init</span>
380    <span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">f</span><span class="special">);</span>  <span class="comment">// all arguments</span>
381    <span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// two arguments</span>
382    <span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">f1</span><span class="special">);</span> <span class="comment">// one argument</span>
383</pre>
384<p>
385        When you want to wrap functions (or member functions) that either:
386      </p>
387<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
388<li class="listitem">
389            have default arguments, or
390          </li>
391<li class="listitem">
392            are overloaded with a common sequence of initial arguments
393          </li>
394</ul></div>
395<h3>
396<a name="tutorial.functions.default_arguments.h0"></a>
397        <span class="phrase"><a name="tutorial.functions.default_arguments.boost_python_function_overloads"></a></span><a class="link" href="functions.html#tutorial.functions.default_arguments.boost_python_function_overloads">BOOST_PYTHON_FUNCTION_OVERLOADS</a>
398      </h3>
399<p>
400        Boost.Python now has a way to make it easier. For instance, given a function:
401      </p>
402<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">2</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">3</span><span class="special">)</span>
403<span class="special">{</span>
404    <span class="comment">/*...*/</span>
405<span class="special">}</span>
406</pre>
407<p>
408        The macro invocation:
409      </p>
410<pre class="programlisting"><span class="identifier">BOOST_PYTHON_FUNCTION_OVERLOADS</span><span class="special">(</span><span class="identifier">foo_overloads</span><span class="special">,</span> <span class="identifier">foo</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span>
411</pre>
412<p>
413        will automatically create the thin wrappers for us. This macro will create
414        a class <code class="literal">foo_overloads</code> that can be passed on to <code class="literal">def(...)</code>.
415        The third and fourth macro argument are the minimum arguments and maximum
416        arguments, respectively. In our <code class="literal">foo</code> function the minimum
417        number of arguments is 1 and the maximum number of arguments is 4. The <code class="literal">def(...)</code>
418        function will automatically add all the foo variants for us:
419      </p>
420<pre class="programlisting"><span class="identifier">def</span><span class="special">(</span><span class="string">"foo"</span><span class="special">,</span> <span class="identifier">foo</span><span class="special">,</span> <span class="identifier">foo_overloads</span><span class="special">());</span>
421</pre>
422<h3>
423<a name="tutorial.functions.default_arguments.h1"></a>
424        <span class="phrase"><a name="tutorial.functions.default_arguments.boost_python_member_function_ove"></a></span><a class="link" href="functions.html#tutorial.functions.default_arguments.boost_python_member_function_ove">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</a>
425      </h3>
426<p>
427        Objects here, objects there, objects here there everywhere. More frequently
428        than anything else, we need to expose member functions of our classes to
429        Python. Then again, we have the same inconveniences as before when default
430        arguments or overloads with a common sequence of initial arguments come into
431        play. Another macro is provided to make this a breeze.
432      </p>
433<p>
434        Like <code class="literal">BOOST_PYTHON_FUNCTION_OVERLOADS</code>, <code class="literal">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</code>
435        may be used to automatically create the thin wrappers for wrapping member
436        functions. Let's have an example:
437      </p>
438<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">george</span>
439<span class="special">{</span>
440    <span class="keyword">void</span>
441    <span class="identifier">wack_em</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="number">0</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">c</span> <span class="special">=</span> <span class="char">'x'</span><span class="special">)</span>
442    <span class="special">{</span>
443        <span class="comment">/*...*/</span>
444    <span class="special">}</span>
445<span class="special">};</span>
446</pre>
447<p>
448        The macro invocation:
449      </p>
450<pre class="programlisting"><span class="identifier">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</span><span class="special">(</span><span class="identifier">george_overloads</span><span class="special">,</span> <span class="identifier">wack_em</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span>
451</pre>
452<p>
453        will generate a set of thin wrappers for george's <code class="literal">wack_em</code>
454        member function accepting a minimum of 1 and a maximum of 3 arguments (i.e.
455        the third and fourth macro argument). The thin wrappers are all enclosed
456        in a class named <code class="literal">george_overloads</code> that can then be used
457        as an argument to <code class="literal">def(...)</code>:
458      </p>
459<pre class="programlisting"><span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"wack_em"</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">george</span><span class="special">::</span><span class="identifier">wack_em</span><span class="special">,</span> <span class="identifier">george_overloads</span><span class="special">());</span>
460</pre>
461<p>
462        See the <a href="../../reference/function_invocation_and_creation/boost_python_overloads_hpp.html#function_invocation_and_creation.boost_python_overloads_hpp.macros" target="_top">overloads
463        reference</a> for details.
464      </p>
465<h3>
466<a name="tutorial.functions.default_arguments.h2"></a>
467        <span class="phrase"><a name="tutorial.functions.default_arguments.init_and_optional"></a></span><a class="link" href="functions.html#tutorial.functions.default_arguments.init_and_optional">init and
468        optional</a>
469      </h3>
470<p>
471        A similar facility is provided for class constructors, again, with default
472        arguments or a sequence of overloads. Remember <code class="literal">init&lt;...&gt;</code>?
473        For example, given a class X with a constructor:
474      </p>
475<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span>
476<span class="special">{</span>
477    <span class="identifier">X</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">b</span> <span class="special">=</span> <span class="char">'D'</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">c</span> <span class="special">=</span> <span class="string">"constructor"</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">);</span>
478    <span class="comment">/*...*/</span>
479<span class="special">}</span>
480</pre>
481<p>
482        You can easily add this constructor to Boost.Python in one shot:
483      </p>
484<pre class="programlisting"><span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="identifier">init</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="special">&gt;())</span>
485</pre>
486<p>
487        Notice the use of <code class="literal">init&lt;...&gt;</code> and <code class="literal">optional&lt;...&gt;</code>
488        to signify the default (optional arguments).
489      </p>
490</div>
491<div class="section">
492<div class="titlepage"><div><div><h3 class="title">
493<a name="tutorial.functions.auto_overloading"></a><a class="link" href="functions.html#tutorial.functions.auto_overloading" title="Auto-Overloading">Auto-Overloading</a>
494</h3></div></div></div>
495<p>
496        It was mentioned in passing in the previous section that <code class="literal">BOOST_PYTHON_FUNCTION_OVERLOADS</code>
497        and <code class="literal">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</code> can also be
498        used for overloaded functions and member functions with a common sequence
499        of initial arguments. Here is an example:
500      </p>
501<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">foo</span><span class="special">()</span>
502<span class="special">{</span>
503   <span class="comment">/*...*/</span>
504<span class="special">}</span>
505
506<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">a</span><span class="special">)</span>
507<span class="special">{</span>
508   <span class="comment">/*...*/</span>
509<span class="special">}</span>
510
511<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">bool</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">)</span>
512<span class="special">{</span>
513   <span class="comment">/*...*/</span>
514<span class="special">}</span>
515
516<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">bool</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">char</span> <span class="identifier">c</span><span class="special">)</span>
517<span class="special">{</span>
518   <span class="comment">/*...*/</span>
519<span class="special">}</span>
520</pre>
521<p>
522        Like in the previous section, we can generate thin wrappers for these overloaded
523        functions in one-shot:
524      </p>
525<pre class="programlisting"><span class="identifier">BOOST_PYTHON_FUNCTION_OVERLOADS</span><span class="special">(</span><span class="identifier">foo_overloads</span><span class="special">,</span> <span class="identifier">foo</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span>
526</pre>
527<p>
528        Then...
529      </p>
530<pre class="programlisting"><span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"foo"</span><span class="special">,</span> <span class="special">(</span><span class="keyword">void</span><span class="special">(*)(</span><span class="keyword">bool</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">char</span><span class="special">))</span><span class="number">0</span><span class="special">,</span> <span class="identifier">foo_overloads</span><span class="special">());</span>
531</pre>
532<p>
533        Notice though that we have a situation now where we have a minimum of zero
534        (0) arguments and a maximum of 3 arguments.
535      </p>
536<h3>
537<a name="tutorial.functions.auto_overloading.h0"></a>
538        <span class="phrase"><a name="tutorial.functions.auto_overloading.manual_wrapping"></a></span><a class="link" href="functions.html#tutorial.functions.auto_overloading.manual_wrapping">Manual
539        Wrapping</a>
540      </h3>
541<p>
542        It is important to emphasize however that <span class="bold"><strong>the overloaded
543        functions must have a common sequence of initial arguments</strong></span>. Otherwise,
544        our scheme above will not work. If this is not the case, we have to wrap
545        our functions <a class="link" href="functions.html#tutorial.functions.overloading" title="Overloading">manually</a>.
546      </p>
547<p>
548        Actually, we can mix and match manual wrapping of overloaded functions and
549        automatic wrapping through <code class="literal">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</code>
550        and its sister, <code class="literal">BOOST_PYTHON_FUNCTION_OVERLOADS</code>. Following
551        up on our example presented in the section <a class="link" href="functions.html#tutorial.functions.overloading" title="Overloading">on
552        overloading</a>, since the first 4 overload functins have a common sequence
553        of initial arguments, we can use <code class="literal">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</code>
554        to automatically wrap the first three of the <code class="literal">def</code>s and
555        manually wrap just the last. Here's how we'll do this:
556      </p>
557<pre class="programlisting"><span class="identifier">BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS</span><span class="special">(</span><span class="identifier">xf_overloads</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">4</span><span class="special">)</span>
558</pre>
559<p>
560        Create a member function pointers as above for both X::f overloads:
561      </p>
562<pre class="programlisting"><span class="keyword">bool</span>    <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx1</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="keyword">char</span><span class="special">)</span>    <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
563<span class="keyword">int</span>     <span class="special">(</span><span class="identifier">X</span><span class="special">::*</span><span class="identifier">fx2</span><span class="special">)(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)</span>        <span class="special">=</span> <span class="special">&amp;</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">f</span><span class="special">;</span>
564</pre>
565<p>
566        Then...
567      </p>
568<pre class="programlisting"><span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx1</span><span class="special">,</span> <span class="identifier">xf_overloads</span><span class="special">());</span>
569<span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">fx2</span><span class="special">)</span>
570</pre>
571</div>
572</div>
573<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
574<td align="left"></td>
575<td align="right"><div class="copyright-footer">Copyright © 2002-2005 Joel
576      de Guzman, David Abrahams<p>
577        Distributed under the Boost Software License, Version 1.0. (See accompanying
578        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>
579      </p>
580</div></td>
581</tr></table>
582<hr>
583<div class="spirit-nav">
584<a accesskey="p" href="exposing.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="object.html"><img src="../../images/next.png" alt="Next"></a>
585</div>
586</body>
587</html>
588