1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>boost/python/init.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="../high_level_components.html" title="Chapter 2. High Level Components"> 9<link rel="prev" href="boost_python_exception_translato.html" title="boost/python/exception_translator.hpp"> 10<link rel="next" href="boost_python_iterator_hpp.html" title="boost/python/iterator.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_exception_translato.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../high_level_components.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_iterator_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="high_level_components.boost_python_init_hpp"></a><a class="link" href="boost_python_init_hpp.html" title="boost/python/init.hpp">boost/python/init.hpp</a> 21</h2></div></div></div> 22<div class="toc"><dl class="toc"> 23<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction">Introduction</a></span></dt> 24<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init">Class 25 template <code class="computeroutput"><span class="identifier">init</span></code></a></span></dt> 26<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_optional">Class 27 template <code class="computeroutput"><span class="identifier">optional</span></code> </a></span></dt> 28<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.example">Example</a></span></dt> 29</dl></div> 30<div class="section"> 31<div class="titlepage"><div><div><h3 class="title"> 32<a name="high_level_components.boost_python_init_hpp.introduction"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction" title="Introduction">Introduction</a> 33</h3></div></div></div> 34<div class="toc"><dl class="toc"><dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions">init-expressions</a></span></dt></dl></div> 35<p> 36 <boost/python/init.hpp> defines the interface for exposing C++ constructors 37 to Python as extension class <code class="computeroutput"><span class="identifier">__init__</span></code> 38 functions. 39 </p> 40<div class="section"> 41<div class="titlepage"><div><div><h4 class="title"> 42<a name="high_level_components.boost_python_init_hpp.introduction.init_expressions"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">init-expressions</a> 43</h4></div></div></div> 44<p> 45 An init-expression is used to describe a family of <code class="computeroutput"><span class="identifier">__init__</span></code> 46 methods to be generated for an extension class, and the result has the 47 following properties: 48 </p> 49<div class="variablelist"> 50<p class="title"><b></b></p> 51<dl class="variablelist"> 52<dt><span class="term">docstring</span></dt> 53<dd><p> 54 An <a class="link" href="../glossary.html#ntbs">ntbs</a> whose value will bound to the 55 method's <code class="computeroutput"><span class="identifier">__doc__</span></code> 56 attribute 57 </p></dd> 58<dt><span class="term">keywords</span></dt> 59<dd><p> 60 A <a class="link" href="../function_invocation_and_creation.html#function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions" title="keyword-expressions">keyword-expression</a> 61 which will be used to name (a trailing subsequence of) the arguments 62 to the generated <code class="computeroutput"><span class="identifier">__init__</span></code> 63 function(s). 64 </p></dd> 65<dt><span class="term">call_policies</span></dt> 66<dd><p> 67 An instance of a model of <a class="link" href="../concepts.html#concepts.callpolicies" title="CallPolicies">CallPolicies</a>. 68 </p></dd> 69<dt><span class="term">argument_types</span></dt> 70<dd><p> 71 An MPL sequence of C++ argument types which will be used to construct 72 the wrapped C++ object. An init expression has one or more valid 73 prefixes which are given by a sequence of prefixes of its argument 74 types. 75 </p></dd> 76</dl> 77</div> 78</div> 79</div> 80<div class="section"> 81<div class="titlepage"><div><div><h3 class="title"> 82<a name="high_level_components.boost_python_init_hpp.class_template_init"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init" title="Class template init">Class 83 template <code class="computeroutput"><span class="identifier">init</span></code></a> 84</h3></div></div></div> 85<div class="toc"><dl class="toc"> 86<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init.class_template_init_constructors">Class 87 template <code class="computeroutput"><span class="identifier">init</span></code> constructors</a></span></dt> 88<dt><span class="section"><a href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init.class_template_init_observer_fun">Class 89 template <code class="computeroutput"><span class="identifier">init</span></code> observer 90 functions</a></span></dt> 91</dl></div> 92<p> 93 A MPL sequence which can be used to specify a family of one or more __init__ 94 functions. Only the last Ti supplied may be an instantiation of optional<...>. 95 </p> 96<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">python</span> 97<span class="special">{</span> 98 <span class="keyword">template</span> <span class="special"><</span><span class="identifier">T1</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,...</span><span class="identifier">Tn</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">></span> 99 <span class="keyword">struct</span> <span class="identifier">init</span> 100 <span class="special">{</span> 101 <span class="identifier">init</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span> 102 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">></span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">kw</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span> 103 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">></span> <span class="identifier">init</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span><span class="special">,</span> <span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">kw</span><span class="special">);</span> 104 105 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallPolicies</span><span class="special">></span> 106 <span class="identifier">unspecified</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">CallPolicies</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">policies</span><span class="special">)</span> <span class="keyword">const</span> 107 <span class="special">};</span> 108<span class="special">}}</span> 109</pre> 110<div class="section"> 111<div class="titlepage"><div><div><h4 class="title"> 112<a name="high_level_components.boost_python_init_hpp.class_template_init.class_template_init_constructors"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init.class_template_init_constructors" title="Class template init constructors">Class 113 template <code class="computeroutput"><span class="identifier">init</span></code> constructors</a> 114</h4></div></div></div> 115<pre class="programlisting"><span class="identifier">init</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span> 116<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">></span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">kw</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span> 117<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Keywords</span><span class="special">></span> <span class="identifier">init</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">doc</span><span class="special">,</span> <span class="identifier">Keywords</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">kw</span><span class="special">);</span> 118</pre> 119<div class="variablelist"> 120<p class="title"><b></b></p> 121<dl class="variablelist"> 122<dt><span class="term">Requires</span></dt> 123<dd><p> 124 If supplied, doc is an <a class="link" href="../glossary.html#ntbs">ntbs</a>. If supplied, 125 kw is the result of a 126 </p></dd> 127<dt><span class="term">Effects</span></dt> 128<dd> 129<p> 130 The result is an init-expression whose docstring is doc and whose 131 keywords are a reference to kw. If the first form is used, the 132 resulting expression's keywords are empty. The expression's call 133 policies are an instance of <a class="link" href="../function_invocation_and_creation/models_of_callpolicies.html#function_invocation_and_creation.models_of_callpolicies.boost_python_default_call_polici" title="boost/python/default_call_policies.hpp">default_call_policies</a>. 134 If Tn is <a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_optional" title="Class template optional">optional<U1, 135 U2,... Um></a>, the expression's valid prefixes are given 136 by: 137 </p> 138<pre class="programlisting"><span class="special">(</span><span class="identifier">T1</span><span class="special">,</span> <span class="identifier">T2</span><span class="special">,...</span><span class="identifier">Tn</span><span class="special">-</span><span class="number">1</span><span class="special">),</span> <span class="special">(</span><span class="identifier">T1</span><span class="special">,</span> <span class="identifier">T2</span><span class="special">,...</span><span class="identifier">Tn</span><span class="special">-</span><span class="number">1</span> <span class="special">,</span> <span class="identifier">U1</span><span class="special">),</span> <span class="special">(</span><span class="identifier">T1</span><span class="special">,</span> <span class="identifier">T2</span><span class="special">,...</span><span class="identifier">Tn</span><span class="special">-</span><span class="number">1</span> <span class="special">,</span> <span class="identifier">U1</span><span class="special">,</span> <span class="identifier">U2</span><span class="special">),</span> <span class="special">...(</span><span class="identifier">T1</span><span class="special">,</span> <span class="identifier">T2</span><span class="special">,...</span><span class="identifier">Tn</span><span class="special">-</span><span class="number">1</span> <span class="special">,</span> <span class="identifier">U1</span><span class="special">,</span> <span class="identifier">U2</span><span class="special">,...</span><span class="identifier">Um</span><span class="special">)</span></pre> 139<p> 140 . Otherwise, the expression has one valid prefix given by the template 141 arguments the user specified. 142 </p> 143</dd> 144</dl> 145</div> 146</div> 147<div class="section"> 148<div class="titlepage"><div><div><h4 class="title"> 149<a name="high_level_components.boost_python_init_hpp.class_template_init.class_template_init_observer_fun"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init.class_template_init_observer_fun" title="Class template init observer functions">Class 150 template <code class="computeroutput"><span class="identifier">init</span></code> observer 151 functions</a> 152</h4></div></div></div> 153<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Policies</span><span class="special">></span> 154<span class="identifier">unspecified</span> <span class="keyword">operator</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> <span class="keyword">const</span> 155</pre> 156<div class="variablelist"> 157<p class="title"><b></b></p> 158<dl class="variablelist"> 159<dt><span class="term">Requires</span></dt> 160<dd><p> 161 Policies is a model of <a class="link" href="../concepts.html#concepts.callpolicies" title="CallPolicies">CallPolicies</a>. 162 </p></dd> 163<dt><span class="term">Effects</span></dt> 164<dd><p> 165 Returns a new <a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">init-expression</a> 166 with all the same properties as the init object except that its 167 call policies are replaced by a reference to policies. 168 </p></dd> 169</dl> 170</div> 171</div> 172</div> 173<div class="section"> 174<div class="titlepage"><div><div><h3 class="title"> 175<a name="high_level_components.boost_python_init_hpp.class_template_optional"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_optional" title="Class template optional">Class 176 template <code class="computeroutput"><span class="identifier">optional</span></code> </a> 177</h3></div></div></div> 178<p> 179 A MPL sequence which can be used to specify the optional arguments to an 180 __init__ function. 181 </p> 182<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">python</span> 183<span class="special">{</span> 184 <span class="keyword">template</span> <span class="special"><</span><span class="identifier">T1</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,...</span><span class="identifier">Tn</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">></span> 185 <span class="keyword">struct</span> <span class="identifier">optional</span> <span class="special">{};</span> 186<span class="special">}}</span> 187</pre> 188</div> 189<div class="section"> 190<div class="titlepage"><div><div><h3 class="title"> 191<a name="high_level_components.boost_python_init_hpp.example"></a><a class="link" href="boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.example" title="Example">Example</a> 192</h3></div></div></div> 193<p> 194 Given the C++ declarations: 195 </p> 196<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">;</span> 197<span class="keyword">class</span> <span class="identifier">X</span> 198<span class="special">{</span> 199 <span class="keyword">public</span><span class="special">:</span> 200 <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="identifier">Y</span><span class="special">*</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">m_y</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="special">{}</span> 201 <span class="identifier">X</span><span class="special">(</span><span class="keyword">double</span><span class="special">);</span> 202 <span class="keyword">private</span><span class="special">:</span> 203 <span class="identifier">Y</span><span class="special">*</span> <span class="identifier">m_y</span><span class="special">;</span> 204<span class="special">};</span> 205</pre> 206<p> 207 A corresponing Boost.Python extension class can be created with: 208 </p> 209<pre class="programlisting"><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> 210 211<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="string">"This is X's docstring."</span><span class="special">,</span> 212 <span class="identifier">init</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*>(</span><span class="identifier">args</span><span class="special">(</span><span class="string">"x"</span><span class="special">,</span><span class="string">"y"</span><span class="special">),</span> <span class="string">"X.__init__'s docstring"</span><span class="special">)[</span> 213 <span class="identifier">with_custodian_and_ward</span><span class="special"><</span><span class="number">1</span><span class="special">,</span><span class="number">3</span><span class="special">>()]</span> 214 <span class="special">)</span> 215 <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="identifier">init</span><span class="special"><</span><span class="keyword">double</span><span class="special">>())</span> 216 <span class="special">;</span> 217</pre> 218</div> 219</div> 220<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 221<td align="left"></td> 222<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p> 223 Distributed under the Boost Software License, Version 1.0. (See accompanying 224 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> 225 </p> 226</div></td> 227</tr></table> 228<hr> 229<div class="spirit-nav"> 230<a accesskey="p" href="boost_python_exception_translato.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../high_level_components.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_iterator_hpp.html"><img src="../../images/next.png" alt="Next"></a> 231</div> 232</body> 233</html> 234