1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>boost/python/data_members.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_method_hpp.html" title="boost/python/call_method.hpp"> 10<link rel="next" href="boost_python_make_function_hpp.html" title="boost/python/make_function.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_method_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_make_function_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_data_members_hpp"></a><a class="link" href="boost_python_data_members_hpp.html" title="boost/python/data_members.hpp">boost/python/data_members.hpp</a> 21</h2></div></div></div> 22<div class="toc"><dl class="toc"> 23<dt><span class="section"><a href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_hpp.introduction">Introduction</a></span></dt> 24<dt><span class="section"><a href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_hpp.functions">Functions</a></span></dt> 25<dt><span class="section"><a href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_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_data_members_hpp.introduction"></a><a class="link" href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_hpp.introduction" title="Introduction">Introduction</a> 30</h3></div></div></div> 31<p> 32 <code class="computeroutput"><span class="identifier">make_getter</span><span class="special">()</span></code> 33 and <code class="computeroutput"><span class="identifier">make_setter</span><span class="special">()</span></code> 34 are the functions used internally by <a class="link" href="../high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu" title="Class template class_ modifier functions"><code class="computeroutput"><span class="identifier">class_</span><span class="special"><>::</span><span class="identifier">def_readonly</span></code></a> and <a class="link" href="../high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu" title="Class template class_ modifier functions"><code class="computeroutput"><span class="identifier">class_</span><span class="special"><>::</span><span class="identifier">def_readwrite</span></code></a> to produce Python 35 callable objects which wrap C++ data members. 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_data_members_hpp.functions"></a><a class="link" href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_hpp.functions" title="Functions">Functions</a> 41</h3></div></div></div> 42<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 43<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="identifier">C</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">);</span> 44 45<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 46<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="identifier">C</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 47</pre> 48<div class="variablelist"> 49<p class="title"><b></b></p> 50<dl class="variablelist"> 51<dt><span class="term">Requires</span></dt> 52<dd><p> 53 Policies is a model of <a class="link" href="../concepts.html#concepts.callpolicies" title="CallPolicies"><code class="computeroutput"><span class="identifier">CallPolicies</span></code></a>. 54 </p></dd> 55<dt><span class="term">Effects</span></dt> 56<dd><p> 57 Creates a Python callable object which accepts a single argument 58 that can be converted from_python to C*, and returns the corresponding 59 member D member of the C object, converted to_python. If policies 60 is supplied, it will be applied to the function as described here. 61 Otherwise, the library attempts to determine whether D is a user-defined 62 class type, and if so uses return_internal_reference<> for 63 Policies. Note that this test may inappropriately choose return_internal_reference<> 64 in some cases when D is a smart pointer type. This is a known defect. 65 </p></dd> 66<dt><span class="term">Returns</span></dt> 67<dd><p> 68 An instance of object which holds the new Python callable object. 69 </p></dd> 70</dl> 71</div> 72<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 73<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">d</span><span class="special">);</span> 74<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 75<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 76 77<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 78<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">p</span><span class="special">);</span> 79<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 80<span class="identifier">object</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">D</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 81</pre> 82<div class="variablelist"> 83<p class="title"><b></b></p> 84<dl class="variablelist"> 85<dt><span class="term">Requires</span></dt> 86<dd><p> 87 Policies is a model of CallPolicies. 88 </p></dd> 89<dt><span class="term">Effects</span></dt> 90<dd><p> 91 Creates a Python callable object which accepts no arguments and returns 92 d or *p, converted to_python on demand. If policies is supplied, 93 it will be applied to the function as described here. Otherwise, 94 the library attempts to determine whether D is a user-defined class 95 type, and if so uses reference_existing_object for Policies. 96 </p></dd> 97<dt><span class="term">Returns</span></dt> 98<dd><p> 99 An instance of object which holds the new Python callable object. 100 </p></dd> 101</dl> 102</div> 103<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 104<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span> <span class="identifier">C</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">);</span> 105 106<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 107<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span> <span class="identifier">C</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 108</pre> 109<div class="variablelist"> 110<p class="title"><b></b></p> 111<dl class="variablelist"> 112<dt><span class="term">Requires</span></dt> 113<dd><p> 114 Policies is a model of CallPolicies. 115 </p></dd> 116<dt><span class="term">Effects</span></dt> 117<dd><p> 118 Creates a Python callable object which, when called from Python, 119 expects two arguments which can be converted from_python to C* and 120 D const&, respectively, and sets the corresponding D member of 121 the C object. If policies is supplied, it will be applied to the 122 function as described here. 123 </p></dd> 124<dt><span class="term">Returns</span></dt> 125<dd><p> 126 An instance of object which holds the new Python callable object. 127 </p></dd> 128</dl> 129</div> 130<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 131<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span><span class="special">&</span> <span class="identifier">d</span><span class="special">);</span> 132<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 133<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span><span class="special">&</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 134 135<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 136<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span><span class="special">*</span> <span class="identifier">p</span><span class="special">);</span> 137<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 138<span class="identifier">object</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">D</span><span class="special">*</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">Policies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">);</span> 139</pre> 140<div class="variablelist"> 141<p class="title"><b></b></p> 142<dl class="variablelist"> 143<dt><span class="term">Requires</span></dt> 144<dd><p> 145 Policies is a model of CallPolicies. 146 </p></dd> 147<dt><span class="term">Effects</span></dt> 148<dd><p> 149 Creates a Python callable object which accepts one argument, which 150 is converted from Python to D const& and written into d or *p, 151 respectively. If policies is supplied, it will be applied to the 152 function as described here. 153 </p></dd> 154<dt><span class="term">Returns</span></dt> 155<dd><p> 156 An instance of object which holds the new Python callable object. 157 </p></dd> 158</dl> 159</div> 160</div> 161<div class="section"> 162<div class="titlepage"><div><div><h3 class="title"> 163<a name="function_invocation_and_creation.boost_python_data_members_hpp.example"></a><a class="link" href="boost_python_data_members_hpp.html#function_invocation_and_creation.boost_python_data_members_hpp.example" title="Example">Example</a> 164</h3></div></div></div> 165<p> 166 The code below uses make_getter and make_setter to expose a data member 167 as functions: 168 </p> 169<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">python</span><span class="special">/</span><span class="identifier">data_members</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 170<span class="preprocessor">#include</span> <span class="special"><</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">></span> 171<span class="preprocessor">#include</span> <span class="special"><</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">></span> 172 173<span class="keyword">struct</span> <span class="identifier">X</span> 174<span class="special">{</span> 175 <span class="identifier">X</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">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">{}</span> 176 <span class="keyword">int</span> <span class="identifier">y</span><span class="special">;</span> 177<span class="special">};</span> 178 179<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> 180 181<span class="identifier">BOOST_PYTHON_MODULE_INIT</span><span class="special">(</span><span class="identifier">data_members_example</span><span class="special">)</span> 182<span class="special">{</span> 183 <span class="identifier">class_</span><span class="special"><</span><span class="identifier">X</span><span class="special">>(</span><span class="string">"X"</span><span class="special">,</span> <span class="identifier">init</span><span class="special"><</span><span class="keyword">int</span><span class="special">>())</span> 184 <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"get"</span><span class="special">,</span> <span class="identifier">make_getter</span><span class="special">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">y</span><span class="special">))</span> 185 <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"set"</span><span class="special">,</span> <span class="identifier">make_setter</span><span class="special">(&</span><span class="identifier">X</span><span class="special">::</span><span class="identifier">y</span><span class="special">))</span> 186 <span class="special">;</span> 187<span class="special">}</span> 188</pre> 189<p> 190 It can be used this way in Python: 191 </p> 192<pre class="programlisting"><span class="special">>>></span> <span class="identifier">from</span> <span class="identifier">data_members_example</span> <span class="identifier">import</span> <span class="special">*</span> 193<span class="special">>>></span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">X</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> 194<span class="special">>>></span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> 195<span class="number">1</span> 196<span class="special">>>></span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">set</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> 197<span class="special">>>></span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> 198<span class="number">2</span> 199</pre> 200</div> 201</div> 202<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 203<td align="left"></td> 204<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p> 205 Distributed under the Boost Software License, Version 1.0. (See accompanying 206 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> 207 </p> 208</div></td> 209</tr></table> 210<hr> 211<div class="spirit-nav"> 212<a accesskey="p" href="boost_python_call_method_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_make_function_hpp.html"><img src="../../images/next.png" alt="Next"></a> 213</div> 214</body> 215</html> 216