• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>boost/python/call_method.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 4. Function Invocation and Creation">
9<link rel="prev" href="boost_python_call_hpp.html" title="boost/python/call.hpp">
10<link rel="next" href="boost_python_data_members_hpp.html" title="boost/python/data_members.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_call_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_data_members_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_call_method_hpp"></a><a class="link" href="boost_python_call_method_hpp.html" title="boost/python/call_method.hpp">boost/python/call_method.hpp</a>
21</h2></div></div></div>
22<div class="toc"><dl class="toc">
23<dt><span class="section"><a href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.introduction">Introduction</a></span></dt>
24<dt><span class="section"><a href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.function_call_method">Function
25        <code class="computeroutput"><span class="identifier">call_method</span></code></a></span></dt>
26<dt><span class="section"><a href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.example">Example</a></span></dt>
27</dl></div>
28<div class="section">
29<div class="titlepage"><div><div><h3 class="title">
30<a name="function_invocation_and_creation.boost_python_call_method_hpp.introduction"></a><a class="link" href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.introduction" title="Introduction">Introduction</a>
31</h3></div></div></div>
32<p>
33          &lt;boost/python/call_method.hpp&gt; defines the call_method family of
34          overloaded function templates, used to invoke callable attributes of Python
35          objects from C++.
36        </p>
37</div>
38<div class="section">
39<div class="titlepage"><div><div><h3 class="title">
40<a name="function_invocation_and_creation.boost_python_call_method_hpp.function_call_method"></a><a class="link" href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.function_call_method" title="Function call_method">Function
41        <code class="computeroutput"><span class="identifier">call_method</span></code></a>
42</h3></div></div></div>
43<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">A1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A2</span><span class="special">,</span> <span class="special">...</span> <span class="keyword">class</span> <span class="identifier">An</span><span class="special">&gt;</span>
44<span class="identifier">R</span> <span class="identifier">call_method</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">self</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">method</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&amp;,</span> <span class="identifier">A2</span> <span class="keyword">const</span><span class="special">&amp;,</span> <span class="special">...</span> <span class="identifier">An</span> <span class="keyword">const</span><span class="special">&amp;)</span>
45</pre>
46<div class="variablelist">
47<p class="title"><b></b></p>
48<dl class="variablelist">
49<dt><span class="term">Requires</span></dt>
50<dd><p>
51                <code class="computeroutput"><span class="identifier">R</span></code> is a pointer type,
52                reference type, or a complete type with an accessible copy constructor
53              </p></dd>
54<dt><span class="term">Effects</span></dt>
55<dd><p>
56                Invokes <code class="computeroutput"><span class="identifier">self</span><span class="special">.</span><span class="identifier">method</span><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...</span><span class="identifier">an</span><span class="special">)</span></code> in Python, where <code class="computeroutput"><span class="identifier">a1</span><span class="special">...</span><span class="identifier">an</span></code>
57                are the arguments to <code class="computeroutput"><span class="identifier">call_method</span><span class="special">()</span></code>, converted to Python objects. For
58                a complete semantic description, see this page.
59              </p></dd>
60<dt><span class="term">Returns</span></dt>
61<dd><p>
62                The result of the Python call, converted to the C++ type <code class="computeroutput"><span class="identifier">R</span></code>.
63              </p></dd>
64<dt><span class="term">Rationale</span></dt>
65<dd><p>
66                <code class="computeroutput"><span class="identifier">call_method</span></code> is critical
67                to implementing C++ virtual functions which are overridable in Python,
68                as shown by the example below.
69              </p></dd>
70</dl>
71</div>
72</div>
73<div class="section">
74<div class="titlepage"><div><div><h3 class="title">
75<a name="function_invocation_and_creation.boost_python_call_method_hpp.example"></a><a class="link" href="boost_python_call_method_hpp.html#function_invocation_and_creation.boost_python_call_method_hpp.example" title="Example">Example</a>
76</h3></div></div></div>
77<p>
78          The following C++ illustrates the use of <code class="computeroutput"><span class="identifier">call_method</span></code>
79          in wrapping a class with a virtual function that can be overridden in Python:
80          C++ Module Definition
81        </p>
82<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">module</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
83<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="keyword">class</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
84<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
85<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cstring</span><span class="special">&gt;</span>
86
87<span class="comment">// class to be wrapped</span>
88<span class="keyword">class</span> <span class="identifier">Base</span>
89<span class="special">{</span>
90 <span class="keyword">public</span><span class="special">:</span>
91   <span class="keyword">virtual</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">class_name</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="string">"Base"</span><span class="special">;</span> <span class="special">}</span>
92   <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">Base</span><span class="special">();</span>
93<span class="special">};</span>
94
95<span class="keyword">bool</span> <span class="identifier">is_base</span><span class="special">(</span><span class="identifier">Base</span><span class="special">*</span> <span class="identifier">b</span><span class="special">)</span>
96<span class="special">{</span>
97   <span class="keyword">return</span> <span class="special">!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">strcmp</span><span class="special">(</span><span class="identifier">b</span><span class="special">-&gt;</span><span class="identifier">class_name</span><span class="special">(),</span> <span class="string">"Base"</span><span class="special">);</span>
98<span class="special">}</span>
99
100<span class="comment">// Wrapper code begins here</span>
101<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>
102
103<span class="comment">// Callback class</span>
104<span class="keyword">class</span> <span class="identifier">Base_callback</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">Base</span>
105<span class="special">{</span>
106 <span class="keyword">public</span><span class="special">:</span>
107   <span class="identifier">Base_callback</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">self</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">m_self</span><span class="special">(</span><span class="identifier">self</span><span class="special">)</span> <span class="special">{}</span>
108
109   <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">class_name</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">call_method</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*&gt;(</span><span class="identifier">m_self</span><span class="special">,</span> <span class="string">"class_name"</span><span class="special">);</span> <span class="special">}</span>
110   <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">Base_name</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">Base</span><span class="special">::</span><span class="identifier">class_name</span><span class="special">();</span> <span class="special">}</span>
111 <span class="keyword">private</span><span class="special">:</span>
112   <span class="identifier">PyObject</span><span class="special">*</span> <span class="keyword">const</span> <span class="identifier">m_self</span><span class="special">;</span>
113<span class="special">};</span>
114
115<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>
116<span class="identifier">BOOST_PYTHON_MODULE</span><span class="special">(</span><span class="identifier">my_module</span><span class="special">)</span>
117<span class="special">{</span>
118    <span class="identifier">def</span><span class="special">(</span><span class="string">"is_base"</span><span class="special">,</span> <span class="identifier">is_base</span><span class="special">);</span>
119
120    <span class="identifier">class_</span><span class="special">&lt;</span><span class="identifier">Base</span><span class="special">,</span><span class="identifier">Base_callback</span><span class="special">,</span> <span class="identifier">noncopyable</span><span class="special">&gt;(</span><span class="string">"Base"</span><span class="special">)</span>
121        <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"class_name"</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">Base_callback</span><span class="special">::</span><span class="identifier">Base_name</span><span class="special">)</span>
122        <span class="special">;</span>
123
124<span class="special">}</span>
125</pre>
126<p>
127          Python code:
128        </p>
129<pre class="programlisting"><span class="special">&gt;&gt;&gt;</span> <span class="identifier">from</span> <span class="identifier">my_module</span> <span class="identifier">import</span> <span class="special">*</span>
130<span class="special">&gt;&gt;&gt;</span> <span class="keyword">class</span> <span class="identifier">Derived</span><span class="special">(</span><span class="identifier">Base</span><span class="special">):</span>
131<span class="special">...</span>    <span class="identifier">def</span> <span class="identifier">__init__</span><span class="special">(</span><span class="identifier">self</span><span class="special">):</span>
132<span class="special">...</span>       <span class="identifier">Base</span><span class="special">.</span><span class="identifier">__init__</span><span class="special">(</span><span class="identifier">self</span><span class="special">)</span>
133<span class="special">...</span>    <span class="identifier">def</span> <span class="identifier">class_name</span><span class="special">(</span><span class="identifier">self</span><span class="special">):</span>
134<span class="special">...</span>       <span class="keyword">return</span> <span class="identifier">self</span><span class="special">.</span><span class="identifier">__class__</span><span class="special">.</span><span class="identifier">__name__</span>
135<span class="special">...</span>
136<span class="special">&gt;&gt;&gt;</span> <span class="identifier">is_base</span><span class="special">(</span><span class="identifier">Base</span><span class="special">())</span> <span class="special">#</span> <span class="identifier">calls</span> <span class="identifier">the</span> <span class="identifier">class_name</span><span class="special">()</span> <span class="identifier">method</span> <span class="identifier">from</span> <span class="identifier">C</span><span class="special">++</span>
137<span class="number">1</span>
138<span class="special">&gt;&gt;&gt;</span> <span class="identifier">is_base</span><span class="special">(</span><span class="identifier">Derived</span><span class="special">())</span>
139<span class="number">0</span>
140</pre>
141</div>
142</div>
143<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
144<td align="left"></td>
145<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
146        Distributed under the Boost Software License, Version 1.0. (See accompanying
147        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>
148      </p>
149</div></td>
150</tr></table>
151<hr>
152<div class="spirit-nav">
153<a accesskey="p" href="boost_python_call_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_data_members_hpp.html"><img src="../../images/next.png" alt="Next"></a>
154</div>
155</body>
156</html>
157