1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Chapter 2. High Level Components</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="index.html" title="Boost.Python Reference Manual"> 9<link rel="prev" href="concepts/objectwrapper.html" title="ObjectWrapper"> 10<link rel="next" href="high_level_components/boost_python_def_hpp.html" title="boost/python/def.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="concepts/objectwrapper.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="high_level_components/boost_python_def_hpp.html"><img src="../images/next.png" alt="Next"></a> 17</div> 18<div class="chapter"> 19<div class="titlepage"><div><div><h1 class="title"> 20<a name="high_level_components"></a>Chapter 2. High Level Components</h1></div></div></div> 21<div class="toc"> 22<p><b>Table of Contents</b></p> 23<dl class="toc"> 24<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp">boost/python/class.hpp</a></span></dt> 25<dd><dl> 26<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.introduction">Introduction</a></span></dt> 27<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel">Class 28 template <code class="computeroutput"><span class="identifier">class_</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="identifier">NonCopyable</span><span class="special">></span></code></a></span></dt> 29<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn">Class 30 template bases<T1, T2, ...TN></a></span></dt> 31<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.examples">Examples</a></span></dt> 32</dl></dd> 33<dt><span class="section"><a href="high_level_components/boost_python_def_hpp.html">boost/python/def.hpp</a></span></dt> 34<dd><dl> 35<dt><span class="section"><a href="high_level_components/boost_python_def_hpp.html#high_level_components.boost_python_def_hpp.introduction">Introduction</a></span></dt> 36<dt><span class="section"><a href="high_level_components/boost_python_def_hpp.html#high_level_components.boost_python_def_hpp.functions">Functions</a></span></dt> 37<dt><span class="section"><a href="high_level_components/boost_python_def_hpp.html#high_level_components.boost_python_def_hpp.example">Example</a></span></dt> 38</dl></dd> 39<dt><span class="section"><a href="high_level_components/boost_python_def_visitor_hpp.html">boost/python/def_visitor.hpp</a></span></dt> 40<dd><dl> 41<dt><span class="section"><a href="high_level_components/boost_python_def_visitor_hpp.html#high_level_components.boost_python_def_visitor_hpp.introduction">Introduction</a></span></dt> 42<dt><span class="section"><a href="high_level_components/boost_python_def_visitor_hpp.html#high_level_components.boost_python_def_visitor_hpp.class_def_visitor">Class 43 <code class="computeroutput"><span class="identifier">def_visitor</span></code></a></span></dt> 44<dt><span class="section"><a href="high_level_components/boost_python_def_visitor_hpp.html#high_level_components.boost_python_def_visitor_hpp.example">Example</a></span></dt> 45</dl></dd> 46<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html">boost/python/docstring_options.hpp</a></span></dt> 47<dd><dl> 48<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.introduction">Introduction</a></span></dt> 49<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.class_docstring_options">Class 50 <code class="computeroutput"><span class="identifier">docstring_options</span></code></a></span></dt> 51<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.class_dostring_options_construct">Class 52 dostring_options constructors</a></span></dt> 53<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.class_docstring_options_destruct">Class 54 docstring_options destructor</a></span></dt> 55<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.class_docstring_options_modifier">Class 56 <code class="computeroutput"><span class="identifier">docstring_options</span></code> modifier 57 functions</a></span></dt> 58<dt><span class="section"><a href="high_level_components/boost_python_docstring_options_h.html#high_level_components.boost_python_docstring_options_h.example">Example</a></span></dt> 59</dl></dd> 60<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html">boost/python/enum.hpp</a></span></dt> 61<dd><dl> 62<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html#high_level_components.boost_python_enum_hpp.introduction">Introduction</a></span></dt> 63<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html#high_level_components.boost_python_enum_hpp.class_template_enum">Class 64 template <code class="computeroutput"><span class="identifier">enum_</span></code></a></span></dt> 65<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html#high_level_components.boost_python_enum_hpp.class_template_enum_constructors">Class 66 template <code class="computeroutput"><span class="identifier">enum_</span></code> constructors</a></span></dt> 67<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html#high_level_components.boost_python_enum_hpp.class_template_enum_modifier_fun">Class 68 template <code class="computeroutput"><span class="identifier">enum_</span></code> modifier functions</a></span></dt> 69<dt><span class="section"><a href="high_level_components/boost_python_enum_hpp.html#high_level_components.boost_python_enum_hpp.example">Example</a></span></dt> 70</dl></dd> 71<dt><span class="section"><a href="high_level_components/boost_python_errors_hpp.html">boost/python/errors.hpp</a></span></dt> 72<dd><dl> 73<dt><span class="section"><a href="high_level_components/boost_python_errors_hpp.html#high_level_components.boost_python_errors_hpp.introduction">Introduction</a></span></dt> 74<dt><span class="section"><a href="high_level_components/boost_python_errors_hpp.html#high_level_components.boost_python_errors_hpp.class_error_already_set">Class 75 <code class="computeroutput"><span class="identifier">error_already_set</span></code></a></span></dt> 76<dt><span class="section"><a href="high_level_components/boost_python_errors_hpp.html#high_level_components.boost_python_errors_hpp.functions">Functions</a></span></dt> 77<dt><span class="section"><a href="high_level_components/boost_python_errors_hpp.html#high_level_components.boost_python_errors_hpp.example">Example</a></span></dt> 78</dl></dd> 79<dt><span class="section"><a href="high_level_components/boost_python_exception_translato.html">boost/python/exception_translator.hpp</a></span></dt> 80<dd><dl> 81<dt><span class="section"><a href="high_level_components/boost_python_exception_translato.html#high_level_components.boost_python_exception_translato.introduction">Introduction</a></span></dt> 82<dt><span class="section"><a href="high_level_components/boost_python_exception_translato.html#high_level_components.boost_python_exception_translato.function_register_exception_tran">Function 83 <code class="computeroutput"><span class="identifier">register_exception_translator</span></code></a></span></dt> 84<dt><span class="section"><a href="high_level_components/boost_python_exception_translato.html#high_level_components.boost_python_exception_translato.example">Example</a></span></dt> 85</dl></dd> 86<dt><span class="section"><a href="high_level_components/boost_python_init_hpp.html">boost/python/init.hpp</a></span></dt> 87<dd><dl> 88<dt><span class="section"><a href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction">Introduction</a></span></dt> 89<dt><span class="section"><a href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_init">Class 90 template <code class="computeroutput"><span class="identifier">init</span></code></a></span></dt> 91<dt><span class="section"><a href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.class_template_optional">Class 92 template <code class="computeroutput"><span class="identifier">optional</span></code> </a></span></dt> 93<dt><span class="section"><a href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.example">Example</a></span></dt> 94</dl></dd> 95<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html">boost/python/iterator.hpp</a></span></dt> 96<dd><dl> 97<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.introduction">Introduction</a></span></dt> 98<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.class_template_iterator">Class 99 template <code class="computeroutput"><span class="identifier">iterator</span></code></a></span></dt> 100<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.class_template_iterator_construc">Class 101 template iterator constructors</a></span></dt> 102<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.class_template_iterators">Class 103 template <code class="computeroutput"><span class="identifier">iterators</span></code></a></span></dt> 104<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.class_template_iterators_nested_">Class 105 template iterators nested types</a></span></dt> 106<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.class_template_iterators_static_">Class 107 template iterators static functions</a></span></dt> 108<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.functions">Functions</a></span></dt> 109<dt><span class="section"><a href="high_level_components/boost_python_iterator_hpp.html#high_level_components.boost_python_iterator_hpp.example">Example</a></span></dt> 110</dl></dd> 111<dt><span class="section"><a href="high_level_components/boost_python_module_hpp.html">boost/python/module.hpp</a></span></dt> 112<dd><dl> 113<dt><span class="section"><a href="high_level_components/boost_python_module_hpp.html#high_level_components.boost_python_module_hpp.introduction">Introduction</a></span></dt> 114<dt><span class="section"><a href="high_level_components/boost_python_module_hpp.html#high_level_components.boost_python_module_hpp.macros">Macros</a></span></dt> 115<dt><span class="section"><a href="high_level_components/boost_python_module_hpp.html#high_level_components.boost_python_module_hpp.examples">Examples</a></span></dt> 116</dl></dd> 117<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html">boost/python/operators.hpp</a></span></dt> 118<dd><dl> 119<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.introduction">Introduction</a></span></dt> 120<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.class_self_ns_self_t">Class 121 <code class="computeroutput"><span class="identifier">self_ns</span><span class="special">::</span><span class="identifier">self_t</span></code></a></span></dt> 122<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.class_template_other">Class 123 template <code class="computeroutput"><span class="identifier">other</span></code></a></span></dt> 124<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.class_template_detail_operator">Class 125 template <code class="computeroutput"><span class="identifier">detail</span><span class="special">::</span><span class="identifier">operator_</span></code></a></span></dt> 126<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.object_self">Object 127 <code class="computeroutput"><span class="identifier">self</span></code></a></span></dt> 128<dt><span class="section"><a href="high_level_components/boost_python_operators_hpp.html#high_level_components.boost_python_operators_hpp.example">Example</a></span></dt> 129</dl></dd> 130<dt><span class="section"><a href="high_level_components/boost_python_scope_hpp.html">boost/python/scope.hpp</a></span></dt> 131<dd><dl> 132<dt><span class="section"><a href="high_level_components/boost_python_scope_hpp.html#high_level_components.boost_python_scope_hpp.introduction">Introduction</a></span></dt> 133<dt><span class="section"><a href="high_level_components/boost_python_scope_hpp.html#high_level_components.boost_python_scope_hpp.class_scope">Class 134 <code class="computeroutput"><span class="identifier">scope</span></code></a></span></dt> 135<dt><span class="section"><a href="high_level_components/boost_python_scope_hpp.html#high_level_components.boost_python_scope_hpp.class_scope_constructors_and_des">Class 136 scope constructors and destructor</a></span></dt> 137<dt><span class="section"><a href="high_level_components/boost_python_scope_hpp.html#high_level_components.boost_python_scope_hpp.example">Example</a></span></dt> 138</dl></dd> 139<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html">boost/python/stl_iterator.hpp</a></span></dt> 140<dd><dl> 141<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.introduction">Introduction</a></span></dt> 142<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.class_template_stl_input_iterato">Class 143 template <code class="computeroutput"><span class="identifier">stl_input_iterator</span></code></a></span></dt> 144<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.class_template_stl_input_iterat0">Class 145 template <code class="computeroutput"><span class="identifier">stl_input_iterator</span></code> 146 constructors</a></span></dt> 147<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.class_template_stl_input_iterat1">Class 148 template <code class="computeroutput"><span class="identifier">stl_input_iterator</span></code> 149 modifiers</a></span></dt> 150<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.class_template_stl_input_iterat2">Class 151 template <code class="computeroutput"><span class="identifier">stl_input_iterator</span></code> 152 observers</a></span></dt> 153<dt><span class="section"><a href="high_level_components/boost_python_stl_iterator_hpp.html#high_level_components.boost_python_stl_iterator_hpp.example">Example</a></span></dt> 154</dl></dd> 155<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html">boost/python/wrapper.hpp</a></span></dt> 156<dd><dl> 157<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.introduction">Introduction</a></span></dt> 158<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.class_override">Class 159 <code class="computeroutput"><span class="identifier">override</span></code></a></span></dt> 160<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.class_override_observer_function">Class 161 <code class="computeroutput"><span class="identifier">override</span></code> observer functions</a></span></dt> 162<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.class_template_wrapper">Class 163 template <code class="computeroutput"><span class="identifier">wrapper</span></code></a></span></dt> 164<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.class_template_wrapper_observer_">Class 165 template <code class="computeroutput"><span class="identifier">wrapper</span></code> observer 166 functions</a></span></dt> 167<dt><span class="section"><a href="high_level_components/boost_python_wrapper_hpp.html#high_level_components.boost_python_wrapper_hpp.example">Example</a></span></dt> 168</dl></dd> 169</dl> 170</div> 171<div class="section"> 172<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 173<a name="high_level_components.boost_python_class_hpp"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp" title="boost/python/class.hpp">boost/python/class.hpp</a> 174</h2></div></div></div> 175<div class="toc"><dl class="toc"> 176<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.introduction">Introduction</a></span></dt> 177<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel">Class 178 template <code class="computeroutput"><span class="identifier">class_</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="identifier">NonCopyable</span><span class="special">></span></code></a></span></dt> 179<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn">Class 180 template bases<T1, T2, ...TN></a></span></dt> 181<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.examples">Examples</a></span></dt> 182</dl></div> 183<div class="section"> 184<div class="titlepage"><div><div><h3 class="title"> 185<a name="high_level_components.boost_python_class_hpp.introduction"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.introduction" title="Introduction">Introduction</a> 186</h3></div></div></div> 187<p> 188 <code class="computeroutput"><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></code> 189 defines the interface through which users expose their C++ classes to Python. 190 It declares the <code class="computeroutput"><span class="identifier">class_</span></code> 191 class template, which is parameterized on the class type being exposed. 192 It also exposes the <code class="computeroutput"><span class="identifier">init</span></code>, 193 <code class="computeroutput"><span class="identifier">optional</span></code> and <code class="computeroutput"><span class="identifier">bases</span></code> utility class templates, which 194 are used in conjunction with <code class="computeroutput"><span class="identifier">class_</span></code>. 195 </p> 196<p> 197 <code class="computeroutput"><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">class_fwd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> contains a forward declaration of the 198 <code class="computeroutput"><span class="identifier">class_</span></code> class template. 199 </p> 200</div> 201<div class="section"> 202<div class="titlepage"><div><div><h3 class="title"> 203<a name="high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel" title="Class template class_<T, Bases, HeldType, NonCopyable>">Class 204 template <code class="computeroutput"><span class="identifier">class_</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="identifier">NonCopyable</span><span class="special">></span></code></a> 205</h3></div></div></div> 206<div class="toc"><dl class="toc"> 207<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.heldtype_semantics">HeldType 208 Semantics</a></span></dt> 209<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_synopsis">Class 210 template <code class="computeroutput"><span class="identifier">class_</span></code> synopsis</a></span></dt> 211<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_constructor">Class 212 template <code class="computeroutput"><span class="identifier">class_</span></code> constructors</a></span></dt> 213<dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu">Class 214 template <code class="computeroutput"><span class="identifier">class_</span></code> modifier 215 functions</a></span></dt> 216</dl></div> 217<p> 218 Creates a Python class associated with the C++ type passed as its first 219 parameter. Although it has four template parameters, only the first one 220 is required. The three optional arguments can actually be supplied <span class="bold"><strong>in any order</strong></span>; Boost.Python determines the role of 221 the argument from its type. 222 </p> 223<div class="informaltable"><table class="table"> 224<colgroup> 225<col> 226<col> 227<col> 228<col> 229</colgroup> 230<thead><tr> 231<th> 232 <p> 233 Template Parameter 234 </p> 235 </th> 236<th> 237 <p> 238 Requirements 239 </p> 240 </th> 241<th> 242 <p> 243 Semantics 244 </p> 245 </th> 246<th> 247 <p> 248 Default 249 </p> 250 </th> 251</tr></thead> 252<tbody> 253<tr> 254<td> 255 <p> 256 <code class="computeroutput"><span class="identifier">T</span></code> 257 </p> 258 </td> 259<td> 260 <p> 261 A class type. 262 </p> 263 </td> 264<td> 265 <p> 266 The class being wrapped 267 </p> 268 </td> 269<td> 270 </td> 271</tr> 272<tr> 273<td> 274 <p> 275 Bases 276 </p> 277 </td> 278<td> 279 <p> 280 A specialization of <a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn" title="Class template bases<T1, T2, ...TN>">bases<...></a> 281 which specifies previously-exposed C++ base classes of <code class="computeroutput"><span class="identifier">T</span></code>. 282 </p> 283 </td> 284<td> 285 <p> 286 Registers <code class="computeroutput"><span class="identifier">from_python</span></code> 287 conversions from wrapped <code class="computeroutput"><span class="identifier">T</span></code> 288 instances to each of its exposed direct and indirect bases. For 289 each polymorphic base <code class="computeroutput"><span class="identifier">B</span></code>, 290 registers conversions from indirectly-held wrapped <code class="computeroutput"><span class="identifier">B</span></code> instances to <code class="computeroutput"><span class="identifier">T</span></code>. 291 </p> 292 </td> 293<td> 294 <p> 295 <a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn" title="Class template bases<T1, T2, ...TN>">bases<></a> 296 </p> 297 </td> 298</tr> 299<tr> 300<td> 301 <p> 302 HeldType 303 </p> 304 </td> 305<td> 306 <p> 307 Must be <code class="computeroutput"><span class="identifier">T</span></code>, a 308 class derived from <code class="computeroutput"><span class="identifier">T</span></code>, 309 or a <a class="link" href="concepts/dereferenceable.html#concepts.dereferenceable.concept_requirements" title="Concept Requirements">Dereferenceable</a> 310 type for which <code class="computeroutput"><span class="identifier">pointee</span><span class="special"><</span><span class="identifier">HeldType</span><span class="special">>::</span><span class="identifier">type</span></code> 311 is <code class="computeroutput"><span class="identifier">T</span></code> or a class 312 derived from <code class="computeroutput"><span class="identifier">T</span></code>. 313 </p> 314 </td> 315<td> 316 <p> 317 Specifies the type that is actually embedded in a Python object 318 wrapping a <code class="computeroutput"><span class="identifier">T</span></code> 319 instance when <code class="computeroutput"><span class="identifier">T</span></code>'s 320 constructor is called or when a <code class="computeroutput"><span class="identifier">T</span></code> 321 or <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span></code> 322 is converted to Python without the use of <a class="link" href="function_invocation_and_creation/boost_python_ptr_hpp.html#function_invocation_and_creation.boost_python_ptr_hpp.functions" title="Functions">ptr</a>, 323 <code class="computeroutput"><span class="identifier">ref</span></code>, or <a class="link" href="concepts.html#concepts.callpolicies" title="CallPolicies">Call Policies</a> such as 324 <a class="link" href="function_invocation_and_creation/models_of_callpolicies.html#function_invocation_and_creation.models_of_callpolicies.boost_python_return_internal_ref.class_template_return_internal_r" title="Class template return_internal_reference">return_internal_reference</a>. 325 More details below. 326 </p> 327 </td> 328<td> 329 <p> 330 <code class="computeroutput"><span class="identifier">T</span></code> 331 </p> 332 </td> 333</tr> 334<tr> 335<td> 336 <p> 337 NonCopyable 338 </p> 339 </td> 340<td> 341 <p> 342 If supplied, must be <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span></code>. 343 </p> 344 </td> 345<td> 346 <p> 347 Suppresses automatic registration of <code class="computeroutput"><span class="identifier">to_python</span></code> 348 conversions which copy <code class="computeroutput"><span class="identifier">T</span></code> 349 instances. Required when <code class="computeroutput"><span class="identifier">T</span></code> 350 has no publicly-accessible copy constructor. 351 </p> 352 </td> 353<td> 354 <p> 355 An unspecified type other than boost::noncopyable. 356 </p> 357 </td> 358</tr> 359</tbody> 360</table></div> 361<div class="section"> 362<div class="titlepage"><div><div><h4 class="title"> 363<a name="high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.heldtype_semantics"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.heldtype_semantics" title="HeldType Semantics">HeldType 364 Semantics</a> 365</h4></div></div></div> 366<div class="orderedlist"><ol class="orderedlist" type="1"> 367<li class="listitem"> 368 If HeldType is derived from <code class="computeroutput"><span class="identifier">T</span></code>, 369 its exposed constructor(s) must accept an initial <code class="computeroutput"><span class="identifier">PyObject</span><span class="special">*</span></code> argument which refers back to the 370 Python object that contains the HeldType instance, as shown in this 371 example. This argument is not included in the <a class="link" href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">init-expression</a> 372 passed to <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">def(init_expr)</a>, 373 below, nor is it passed explicitly by users when Python instances 374 of <code class="computeroutput"><span class="identifier">T</span></code> are created. 375 This idiom allows C++ virtual functions which will be overridden 376 in Python to access the Python object so the Python method can be 377 invoked. Boost.Python automatically registers additional converters 378 which allow wrapped instances of <code class="computeroutput"><span class="identifier">T</span></code> 379 to be passed to wrapped C++ functions expecting HeldType arguments. 380 </li> 381<li class="listitem"> 382 Because Boost.Python will always allow wrapped instances of <code class="computeroutput"><span class="identifier">T</span></code> to be passed in place of HeldType 383 arguments, specifying a smart pointer for HeldType allows users to 384 pass Python <code class="computeroutput"><span class="identifier">T</span></code> instances 385 where a smart pointer-to-T is expected. Smart pointers such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">auto_ptr</span><span class="special"><></span></code> 386 or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><></span></code> 387 which contain a nested type <code class="computeroutput"><span class="identifier">element_type</span></code> 388 designating the referent type are automatically supported; additional 389 smart pointer types can be supported by specializing <code class="computeroutput"><span class="identifier">pointee</span><span class="special"><</span><span class="identifier">HeldType</span><span class="special">></span></code>. 390 </li> 391<li class="listitem"> 392 As in case 1 above, when HeldType is a smart pointer to a class derived 393 from <code class="computeroutput"><span class="identifier">T</span></code>, the initial 394 <code class="computeroutput"><span class="identifier">PyObject</span><span class="special">*</span></code> 395 argument must be supplied by all of HeldType's exposed constructors. 396 </li> 397<li class="listitem"> 398 Except in cases 1 and 3, users may optionally specify that T itself 399 gets initialized with a similar initial <code class="computeroutput"><span class="identifier">PyObject</span><span class="special">*</span></code> argument by specializing <a class="link" href="utility_and_infrastructure.html#utility_and_infrastructure.boost_python_has_back_reference_.class_template_has_back_referenc" title="Class template has_back_reference">has_back_reference<T></a>. 400 </li> 401</ol></div> 402</div> 403<div class="section"> 404<div class="titlepage"><div><div><h4 class="title"> 405<a name="high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_synopsis"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_synopsis" title="Class template class_ synopsis">Class 406 template <code class="computeroutput"><span class="identifier">class_</span></code> synopsis</a> 407</h4></div></div></div> 408<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> 409<span class="special">{</span> 410<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span> 411 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Bases</span> <span class="special">=</span> <span class="identifier">bases</span><span class="special"><></span> 412 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">HeldType</span> <span class="special">=</span> <span class="identifier">T</span> 413 <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">NonCopyable</span> <span class="special">=</span> <span class="identifier">unspecified</span> 414 <span class="special">></span> 415<span class="keyword">class</span> <span class="identifier">class_</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">object</span> 416<span class="special">{</span> 417 <span class="comment">// Constructors with default __init__</span> 418 <span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">);</span> 419 <span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">docstring</span><span class="special">);</span> 420 421 <span class="comment">// Constructors, specifying non-default __init__</span> 422 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 423 <span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Init</span><span class="special">);</span> 424 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 425 <span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">docstring</span><span class="special">,</span> <span class="identifier">Init</span><span class="special">);</span> 426 427 <span class="comment">// Exposing additional __init__ functions</span> 428 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 429 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="identifier">Init</span><span class="special">);</span> 430 431 <span class="comment">// defining methods</span> 432 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 433 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> 434 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> 435 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&);</span> 436 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</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> 437 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">A2</span> <span class="keyword">const</span><span class="special">&);</span> 438 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</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="keyword">class</span> <span class="identifier">A3</span><span class="special">></span> 439 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">A2</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">A3</span> <span class="keyword">const</span><span class="special">&);</span> 440 441 <span class="comment">// declaring method as static</span> 442 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">staticmethod</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">);</span> 443 444 <span class="comment">// exposing operators</span> 445 <span class="keyword">template</span> <span class="special"><</span><span class="identifier">unspecified</span><span class="special">></span> 446 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">operator_</span><span class="special"><</span><span class="identifier">unspecified</span><span class="special">>);</span> 447 448 <span class="comment">// Raw attribute modification</span> 449 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> 450 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">setattr</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&);</span> 451 452 <span class="comment">// exposing data members</span> 453 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 454 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readonly</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">);</span> 455 456 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 457 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readwrite</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</span><span class="special">);</span> 458 459 <span class="comment">// exposing static data members</span> 460 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 461 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readonly</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</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> 462 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 463 <span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readwrite</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span><span class="special">&</span> <span class="identifier">d</span><span class="special">);</span> 464 465 <span class="comment">// property creation</span> 466 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">></span> 467 <span class="keyword">void</span> <span class="identifier">add_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</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> 468 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Set</span><span class="special">></span> 469 <span class="keyword">void</span> <span class="identifier">add_property</span><span class="special">(</span> 470 <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">,</span> <span class="identifier">Set</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fset</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> 471 472 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">></span> 473 <span class="keyword">void</span> <span class="identifier">add_static_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">);</span> 474 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Set</span><span class="special">></span> 475 <span class="keyword">void</span> <span class="identifier">add_static_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">,</span> <span class="identifier">Set</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fset</span><span class="special">);</span> 476 477 <span class="comment">// pickle support</span> 478 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">PickleSuite</span><span class="special">></span> 479 <span class="identifier">self</span><span class="special">&</span> <span class="identifier">def_pickle</span><span class="special">(</span><span class="identifier">PickleSuite</span> <span class="keyword">const</span><span class="special">&);</span> 480 <span class="identifier">self</span><span class="special">&</span> <span class="identifier">enable_pickling</span><span class="special">();</span> 481<span class="special">};</span> 482<span class="special">}}</span> 483</pre> 484</div> 485<div class="section"> 486<div class="titlepage"><div><div><h4 class="title"> 487<a name="high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_constructor"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_constructor" title="Class template class_ constructors">Class 488 template <code class="computeroutput"><span class="identifier">class_</span></code> constructors</a> 489</h4></div></div></div> 490<pre class="programlisting"><span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">);</span> 491<span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">docstring</span><span class="special">);</span> 492<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 493<span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Init</span> <span class="identifier">init_spec</span><span class="special">);</span> 494<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 495<span class="identifier">class_</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">docstring</span><span class="special">,</span> <span class="identifier">Init</span> <span class="identifier">init_spec</span><span class="special">);</span> 496</pre> 497<div class="variablelist"> 498<p class="title"><b></b></p> 499<dl class="variablelist"> 500<dt><span class="term">Requires</span></dt> 501<dd><p> 502 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 503 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 504 naming rules</a>. If docstring is supplied, it must be an 505 <a class="link" href="glossary.html#ntbs">ntbs</a>. If <code class="computeroutput"><span class="identifier">init_spec</span></code> 506 is supplied, it must be either the special enumeration constant 507 <code class="computeroutput"><span class="identifier">no_init</span></code> or an 508 <a class="link" href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">init-expression</a> 509 compatible with <code class="computeroutput"><span class="identifier">T</span></code>. 510 </p></dd> 511<dt><span class="term">Effects</span></dt> 512<dd> 513<p> 514 Constructs a <code class="computeroutput"><span class="identifier">class_</span></code> 515 object holding a Boost.Python extension class named name. The named 516 attribute of the <a class="link" href="high_level_components/boost_python_scope_hpp.html#high_level_components.boost_python_scope_hpp.introduction" title="Introduction">current 517 scope</a> is bound to the new extension class. 518 </p> 519<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 520<li class="listitem"> 521 If supplied, the value of docstring is bound to the <code class="computeroutput"><span class="identifier">__doc__</span></code> attribute of the 522 extension class. 523 </li> 524<li class="listitem"> 525 If <code class="computeroutput"><span class="identifier">init_spec</span></code> 526 is <code class="computeroutput"><span class="identifier">no_init</span></code>, 527 a special <code class="computeroutput"><span class="identifier">__init__</span></code> 528 function is generated which always raises a Python exception. 529 Otherwise, <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">def</span><span class="special">(</span><span class="identifier">init_spec</span><span class="special">)</span></code> is called. 530 </li> 531<li class="listitem"> 532 If <code class="computeroutput"><span class="identifier">init_spec</span></code> 533 is not supplied, <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">def</span><span class="special">(</span><span class="identifier">init</span><span class="special"><>())</span></code> is called. 534 </li> 535</ul></div> 536</dd> 537<dt><span class="term">Rationale</span></dt> 538<dd><p> 539 Allowing the user to specify constructor arguments in the <code class="computeroutput"><span class="identifier">class_</span><span class="special"><></span></code> 540 constructor helps her to avoid the common run-time errors which 541 result from invoking wrapped member functions without having exposed 542 an <code class="computeroutput"><span class="identifier">__init__</span></code> function 543 which creates the requisite <code class="computeroutput"><span class="identifier">T</span></code> 544 instance. Types which are not default-constructible will cause 545 a compile-time error unless <code class="computeroutput"><span class="identifier">Init</span></code> 546 is supplied. The user must always supply name as there is currently 547 no portable method to derive the text of the class name from its 548 type. 549 </p></dd> 550</dl> 551</div> 552</div> 553<div class="section"> 554<div class="titlepage"><div><div><h4 class="title"> 555<a name="high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu"></a><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">Class 556 template <code class="computeroutput"><span class="identifier">class_</span></code> modifier 557 functions</a> 558</h4></div></div></div> 559<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Init</span><span class="special">></span> 560<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="identifier">Init</span> <span class="identifier">init_expr</span><span class="special">);</span> 561</pre> 562<div class="variablelist"> 563<p class="title"><b></b></p> 564<dl class="variablelist"> 565<dt><span class="term">Requires</span></dt> 566<dd><p> 567 <code class="computeroutput"><span class="identifier">init_expr</span></code> is the 568 result of an <a class="link" href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">init-expression</a> 569 compatible with <code class="computeroutput"><span class="identifier">T</span></code>. 570 </p></dd> 571<dt><span class="term">Effects</span></dt> 572<dd><p> 573 For each <a class="link" href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">valid 574 prefix</a> <code class="computeroutput"><span class="identifier">P</span></code> 575 of <code class="computeroutput"><span class="identifier">Init</span></code>, adds an 576 <code class="computeroutput"><span class="identifier">__init__</span><span class="special">(...)</span></code> 577 function overload to the extension class accepting P as arguments. 578 Each overload generated constructs an object of HeldType according 579 to the semantics described above, using a copy of init_expr's call 580 policies. If the longest <a class="link" href="high_level_components/boost_python_init_hpp.html#high_level_components.boost_python_init_hpp.introduction.init_expressions" title="init-expressions">valid 581 prefix</a> of Init contains N types and init_expr holds M keywords, 582 an initial sequence of the keywords are used for all but the first 583 N - M arguments of each overload. 584 </p></dd> 585<dt><span class="term">Returns</span></dt> 586<dd><p> 587 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 588 </p></dd> 589<dt><span class="term">Rationale</span></dt> 590<dd><p> 591 Allows users to easily expose a class' constructor to Python. 592 </p></dd> 593</dl> 594</div> 595<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 596<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">);</span> 597<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">A1</span><span class="special">></span> 598<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a1</span><span class="special">);</span> 599<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</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> 600<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a2</span><span class="special">);</span> 601<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</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="keyword">class</span> <span class="identifier">A3</span><span class="special">></span> 602<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a2</span><span class="special">,</span> <span class="identifier">A3</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">a3</span><span class="special">);</span> 603</pre> 604<div class="variablelist"> 605<p class="title"><b></b></p> 606<dl class="variablelist"> 607<dt><span class="term">Requires</span></dt> 608<dd> 609<p> 610 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 611 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 612 naming rules</a>. * If a1 is the result of an <a class="link" href="function_invocation_and_creation/boost_python_overloads_hpp.html#function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions" title="overload-dispatch-expressions">overload-dispatch-expression</a>, 613 only the second form is allowed and fn must be a pointer to function 614 or pointer to member function whose <a class="link" href="glossary.html#arity">arity</a> 615 is the same as A1's <a class="link" href="function_invocation_and_creation/boost_python_overloads_hpp.html#function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions" title="overload-dispatch-expressions">maximum 616 arity</a>. 617 </p> 618<p> 619 <span class="bold"><strong>Effects:</strong></span> For each prefix <code class="computeroutput"><span class="identifier">P</span></code> of <code class="computeroutput"><span class="identifier">Fn</span></code>'s 620 sequence of argument types, beginning with the one whose length 621 is <code class="computeroutput"><span class="identifier">A1</span></code>'s <a class="link" href="function_invocation_and_creation/boost_python_overloads_hpp.html#function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions" title="overload-dispatch-expressions">minimum 622 arity</a>, adds a <code class="computeroutput"><span class="identifier">name</span><span class="special">(...)</span></code> method overload to the extension 623 class. Each overload generated invokes a1's call-expression with 624 <code class="computeroutput"><span class="identifier">P</span></code>, using a copy 625 of a1's call policies. If the longest valid prefix of <code class="computeroutput"><span class="identifier">A1</span></code> contains <code class="computeroutput"><span class="identifier">N</span></code> 626 types and a1 holds <code class="computeroutput"><span class="identifier">M</span></code> 627 keywords, an initial sequence of the keywords are used for all 628 but the first <code class="computeroutput"><span class="identifier">N</span> <span class="special">-</span> <span class="identifier">M</span></code> 629 arguments of each overload. 630 </p> 631<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 632 Otherwise, a single method overload is built around fn, which 633 must not be null: 634 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "> 635<li class="listitem"> 636 If fn is a function pointer, its first argument must 637 be of the form U, U cv&, U cv*, or U cv* const&, 638 where T* is convertible to U*, and a1-a3, if supplied, 639 may be selected in any order from the table below. 640 </li> 641<li class="listitem"> 642 Otherwise, if fn is a member function pointer, its target 643 must be T or one of its public base classes, and a1-a3, 644 if supplied, may be selected in any order from the table 645 below. 646 </li> 647<li class="listitem"> 648<p class="simpara"> 649 Otherwise, Fn must be [derived from] <a class="link" href="object_wrappers/boost_python_object_hpp.html#object_wrappers.boost_python_object_hpp.class_object" title="Class object">object</a>, 650 and a1-a2, if supplied, may be selcted in any order from 651 the first two rows of the table below. To be useful, 652 fn should be <a href="http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-6" target="_top">callable</a>. 653 </p> 654<div class="informaltable"><table class="table"> 655<colgroup> 656<col> 657<col> 658<col> 659</colgroup> 660<thead><tr> 661<th> 662 <p> 663 Mnemonic Name 664 </p> 665 </th> 666<th> 667 <p> 668 Requirements/Type properties 669 </p> 670 </th> 671<th> 672 <p> 673 Effects 674 </p> 675 </th> 676</tr></thead> 677<tbody> 678<tr> 679<td> 680 <p> 681 docstring 682 </p> 683 </td> 684<td> 685 <p> 686 Any <a class="link" href="glossary.html#ntbs">ntbs</a> 687 </p> 688 </td> 689<td> 690 <p> 691 Value will be bound to the __doc__ attribute 692 of the resulting method overload. If an earlier 693 overload supplied a docstring, two newline 694 characters and the new docstring are appended 695 to it. 696 </p> 697 </td> 698</tr> 699<tr> 700<td> 701 <p> 702 policies 703 </p> 704 </td> 705<td> 706 <p> 707 A model of <a class="link" href="concepts.html#concepts.callpolicies" title="CallPolicies">CallPolicies</a> 708 </p> 709 </td> 710<td> 711 <p> 712 A copy will be used as the call policies of 713 the resulting method overload. 714 </p> 715 </td> 716</tr> 717<tr> 718<td> 719 <p> 720 keywords 721 </p> 722 </td> 723<td> 724 <p> 725 The result of 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> 726 specifying no more arguments than the <a class="link" href="glossary.html#arity">arity</a> of fn. 727 </p> 728 </td> 729<td> 730 <p> 731 A copy will be used as the call policies of 732 the resulting method overload. 733 </p> 734 </td> 735</tr> 736</tbody> 737</table></div> 738</li> 739</ul></div> 740 </li></ul></div> 741</dd> 742<dt><span class="term">Returns</span></dt> 743<dd><p> 744 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 745 </p></dd> 746</dl> 747</div> 748<pre class="programlisting"><span class="identifier">class_</span><span class="special">&</span> <span class="identifier">staticmethod</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">);</span></pre> 749<div class="variablelist"> 750<p class="title"><b></b></p> 751<dl class="variablelist"> 752<dt><span class="term">Requires</span></dt> 753<dd><p> 754 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 755 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 756 naming rules</a>, and corresponds to a method whose overloads 757 have all been defined. 758 </p></dd> 759<dt><span class="term">Effects</span></dt> 760<dd><p> 761 Replaces the existing named attribute <code class="computeroutput"><span class="identifier">x</span></code> 762 with the result of invoking <code class="computeroutput"><span class="identifier">staticmethod</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> in Python. Specifies that the 763 corresponding method is static and therefore no object instance 764 will be passed to it. This is equivalent to the Python statement: 765 </p></dd> 766</dl> 767</div> 768<pre class="programlisting"><span class="identifier">setattr</span><span class="special">(</span><span class="identifier">self</span><span class="special">,</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">staticmethod</span><span class="special">(</span><span class="identifier">getattr</span><span class="special">(</span><span class="identifier">self</span><span class="special">,</span> <span class="identifier">name</span><span class="special">)))</span></pre> 769<div class="variablelist"> 770<p class="title"><b></b></p> 771<dl class="variablelist"> 772<dt><span class="term">Note</span></dt> 773<dd><p> 774 Attempting to invoke def(name,...) after invoking staticmethod(name) 775 will <a class="link" href="glossary.html#raise">raise</a> a RuntimeError. 776 </p></dd> 777<dt><span class="term">Returns</span></dt> 778<dd><p> 779 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 780 </p></dd> 781</dl> 782</div> 783<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="identifier">unspecified</span><span class="special">></span> 784<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">operator_</span><span class="special"><</span><span class="identifier">unspecified</span><span class="special">>);</span> 785</pre> 786<div class="variablelist"> 787<p class="title"><b></b></p> 788<dl class="variablelist"> 789<dt><span class="term">Effects</span></dt> 790<dd><p> 791 Adds a Python <a href="http://www.python.org/doc/ref/specialnames.html" target="_top">special 792 method</a> as described <a class="link" href="high_level_components/boost_python_operators_hpp.html" title="boost/python/operators.hpp">here</a>. 793 </p></dd> 794<dt><span class="term">Returns</span></dt> 795<dd><p> 796 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 797 </p></dd> 798</dl> 799</div> 800<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> 801<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">setattr</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">u</span><span class="special">);</span> 802</pre> 803<div class="variablelist"> 804<p class="title"><b></b></p> 805<dl class="variablelist"> 806<dt><span class="term">Requires</span></dt> 807<dd><p> 808 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 809 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 810 naming rules</a>. 811 </p></dd> 812<dt><span class="term">Effects</span></dt> 813<dd> 814<p> 815 Converts <code class="computeroutput"><span class="identifier">u</span></code> to Python 816 and adds it to the attribute dictionary of the extension class: 817 </p> 818<pre class="programlisting"><span class="identifier">PyObject_SetAttrString</span><span class="special">(</span><span class="keyword">this</span><span class="special">-></span><span class="identifier">ptr</span><span class="special">(),</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">object</span><span class="special">(</span><span class="identifier">u</span><span class="special">).</span><span class="identifier">ptr</span><span class="special">());</span></pre> 819</dd> 820<dt><span class="term">Returns</span></dt> 821<dd><p> 822 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 823 </p></dd> 824</dl> 825</div> 826<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">></span> 827<span class="keyword">void</span> <span class="identifier">add_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</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> 828<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Set</span><span class="special">></span> 829<span class="keyword">void</span> <span class="identifier">add_property</span><span class="special">(</span> 830 <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">,</span> <span class="identifier">Set</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fset</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> 831</pre> 832<div class="variablelist"> 833<p class="title"><b></b></p> 834<dl class="variablelist"> 835<dt><span class="term">Requires</span></dt> 836<dd><p> 837 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conform to Python's 838 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 839 naming rules</a>. 840 </p></dd> 841<dt><span class="term">Effects</span></dt> 842<dd><p> 843 Creates a new Python <a href="http://www.python.org/2.2.2/descrintro.html#property" target="_top">property</a> 844 class instance, passing <code class="computeroutput"><span class="identifier">object</span><span class="special">(</span><span class="identifier">fget</span><span class="special">)</span></code> (and <code class="computeroutput"><span class="identifier">object</span><span class="special">(</span><span class="identifier">fset</span><span class="special">)</span></code> in the second form) with an (optional) 845 docstring <code class="computeroutput"><span class="identifier">doc</span></code> to 846 its constructor, then adds that property to the Python class object 847 under construction with the given attribute name. 848 </p></dd> 849<dt><span class="term">Returns</span></dt> 850<dd><p> 851 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 852 </p></dd> 853<dt><span class="term">Rationale</span></dt> 854<dd><p> 855 Allows users to easily expose functions that can be invoked from 856 Python with attribute access syntax. 857 </p></dd> 858</dl> 859</div> 860<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">></span> 861<span class="keyword">void</span> <span class="identifier">add_static_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">);</span> 862<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Get</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Set</span><span class="special">></span> 863<span class="keyword">void</span> <span class="identifier">add_static_property</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">Get</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fget</span><span class="special">,</span> <span class="identifier">Set</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">fset</span><span class="special">);</span> 864</pre> 865<div class="variablelist"> 866<p class="title"><b></b></p> 867<dl class="variablelist"> 868<dt><span class="term">Requires</span></dt> 869<dd><p> 870 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 871 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 872 naming rules</a>. 873 </p></dd> 874<dt><span class="term">Effects</span></dt> 875<dd><p> 876 Creates a Boost.Python.StaticProperty object, passing <code class="computeroutput"><span class="identifier">object</span><span class="special">(</span><span class="identifier">fget</span><span class="special">)</span></code> 877 (and <code class="computeroutput"><span class="identifier">object</span><span class="special">(</span><span class="identifier">fset</span><span class="special">)</span></code> 878 in the second form) to its constructor, then adds that property 879 to the Python class under construction with the given attribute 880 name. StaticProperty is a special subclass of Python's property 881 class which can be called without an initial self argument. 882 </p></dd> 883<dt><span class="term">Returns</span></dt> 884<dd><p> 885 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 886 </p></dd> 887<dt><span class="term">Rationale</span></dt> 888<dd><p> 889 Allows users to easily expose functions that can be invoked from 890 Python with static attribute access syntax. 891 </p></dd> 892</dl> 893</div> 894<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> 895<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readonly</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</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> 896<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 897<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readonly</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</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> 898</pre> 899<div class="variablelist"> 900<p class="title"><b></b></p> 901<dl class="variablelist"> 902<dt><span class="term">Requires</span></dt> 903<dd><p> 904 name is an <a class="link" href="glossary.html#ntbs">ntbs</a> which conforms to Python's 905 <a href="http://www.python.org/doc/current/ref/identifiers.html" target="_top">identifier 906 naming rules</a>. <code class="computeroutput"><span class="identifier">doc</span></code> 907 is also an <a class="link" href="glossary.html#ntbs">ntbs</a>. 908 </p></dd> 909<dt><span class="term">Effects</span></dt> 910<dd> 911<pre class="programlisting"><span class="keyword">this</span><span class="special">-></span><span class="identifier">add_property</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">pm</span><span class="special">),</span> <span class="identifier">doc</span><span class="special">);</span></pre> 912<p> 913 and 914 </p> 915<pre class="programlisting"><span class="keyword">this</span><span class="special">-></span><span class="identifier">add_static_property</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">d</span><span class="special">));</span></pre> 916<p> 917 respectively. 918 </p> 919</dd> 920<dt><span class="term">Returns</span></dt> 921<dd><p> 922 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 923 </p></dd> 924<dt><span class="term">Rationale</span></dt> 925<dd><p> 926 Allows users to easily expose a class' data member or free variable 927 such that it can be inspected from Python with a natural syntax. 928 </p></dd> 929</dl> 930</div> 931<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> 932<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readwrite</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span> <span class="identifier">T</span><span class="special">::*</span><span class="identifier">pm</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> 933<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">></span> 934<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_readwrite</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">,</span> <span class="identifier">D</span><span class="special">&</span> <span class="identifier">d</span><span class="special">);</span> 935</pre> 936<div class="variablelist"> 937<p class="title"><b></b></p> 938<dl class="variablelist"> 939<dt><span class="term">Effects</span></dt> 940<dd> 941<pre class="programlisting"><span class="keyword">this</span><span class="special">-></span><span class="identifier">add_property</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">pm</span><span class="special">),</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">pm</span><span class="special">),</span> <span class="identifier">doc</span><span class="special">);</span></pre> 942<p> 943 and 944 </p> 945<pre class="programlisting"><span class="keyword">this</span><span class="special">-></span><span class="identifier">add_static_property</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">make_getter</span><span class="special">(</span><span class="identifier">d</span><span class="special">),</span> <span class="identifier">make_setter</span><span class="special">(</span><span class="identifier">d</span><span class="special">));</span></pre> 946<p> 947 respectively. 948 </p> 949</dd> 950<dt><span class="term">Returns</span></dt> 951<dd><p> 952 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 953 </p></dd> 954<dt><span class="term">Rationale</span></dt> 955<dd><p> 956 Allows users to easily expose a class' data or free variable member 957 such that it can be inspected and set from Python with a natural 958 syntax. 959 </p></dd> 960</dl> 961</div> 962<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">PickleSuite</span><span class="special">></span> 963<span class="identifier">class_</span><span class="special">&</span> <span class="identifier">def_pickle</span><span class="special">(</span><span class="identifier">PickleSuite</span> <span class="keyword">const</span><span class="special">&);</span> 964</pre> 965<div class="variablelist"> 966<p class="title"><b></b></p> 967<dl class="variablelist"> 968<dt><span class="term">Requires</span></dt> 969<dd><p> 970 PickleSuite must be publically derived from <a class="link" href="topics/pickle_support.html#topics.pickle_support.the_pickle_interface" title="The Pickle Interface">pickle_suite</a>. 971 </p></dd> 972<dt><span class="term">Effects</span></dt> 973<dd><p> 974 Defines a legal combination of the special attributes and methods: 975 __getinitargs__, __getstate__, __setstate__, __getstate_manages_dict__, 976 __safe_for_unpickling__, __reduce__ 977 </p></dd> 978<dt><span class="term">Returns</span></dt> 979<dd><p> 980 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 981 </p></dd> 982<dt><span class="term">Rationale</span></dt> 983<dd><p> 984 Provides an <a class="link" href="topics/pickle_support.html#topics.pickle_support.the_pickle_interface" title="The Pickle Interface">easy 985 to use high-level interface</a> for establishing complete <a class="link" href="topics/pickle_support.html#topics.pickle_support.the_pickle_interface" title="The Pickle Interface">pickle support</a> 986 for the wrapped class. The user is protected by compile-time consistency 987 checks. 988 </p></dd> 989</dl> 990</div> 991<pre class="programlisting"><span class="identifier">class_</span><span class="special">&</span> <span class="identifier">enable_pickling</span><span class="special">();</span></pre> 992<div class="variablelist"> 993<p class="title"><b></b></p> 994<dl class="variablelist"> 995<dt><span class="term">Effects</span></dt> 996<dd><p> 997 Defines the __reduce__ method and the __safe_for_unpickling__ attribute. 998 </p></dd> 999<dt><span class="term">Returns</span></dt> 1000<dd><p> 1001 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 1002 </p></dd> 1003<dt><span class="term">Rationale</span></dt> 1004<dd><p> 1005 Light-weight alternative to def_pickle(). Enables implementation 1006 of pickle support from Python. 1007 </p></dd> 1008</dl> 1009</div> 1010</div> 1011</div> 1012<div class="section"> 1013<div class="titlepage"><div><div><h3 class="title"> 1014<a name="high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn" title="Class template bases<T1, T2, ...TN>">Class 1015 template bases<T1, T2, ...TN></a> 1016</h3></div></div></div> 1017<div class="toc"><dl class="toc"><dt><span class="section"><a href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn.class_template_bases_synopsis">Class 1018 template bases synopsis</a></span></dt></dl></div> 1019<p> 1020 An MPL sequence which can be used in class_<...> instantiations indicate 1021 a list of base classes. 1022 </p> 1023<div class="section"> 1024<div class="titlepage"><div><div><h4 class="title"> 1025<a name="high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn.class_template_bases_synopsis"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn.class_template_bases_synopsis" title="Class template bases synopsis">Class 1026 template bases synopsis</a> 1027</h4></div></div></div> 1028<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> 1029<span class="special">{</span> 1030 <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> 1031 <span class="keyword">struct</span> <span class="identifier">bases</span> 1032 <span class="special">{};</span> 1033<span class="special">}}</span> 1034</pre> 1035</div> 1036</div> 1037<div class="section"> 1038<div class="titlepage"><div><div><h3 class="title"> 1039<a name="high_level_components.boost_python_class_hpp.examples"></a><a class="link" href="high_level_components.html#high_level_components.boost_python_class_hpp.examples" title="Examples">Examples</a> 1040</h3></div></div></div> 1041<p> 1042 Given a C++ class declaration: 1043 </p> 1044<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">Foo</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">Bar</span><span class="special">,</span> <span class="keyword">public</span> <span class="identifier">Baz</span> 1045<span class="special">{</span> 1046 <span class="keyword">public</span><span class="special">:</span> 1047 <span class="identifier">Foo</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">y</span><span class="special">);</span> 1048 <span class="identifier">Foo</span><span class="special">(</span><span class="keyword">double</span><span class="special">);</span> 1049 1050 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">m_name</span><span class="special">;</span> <span class="special">}</span> 1051 <span class="keyword">void</span> <span class="identifier">name</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*);</span> 1052 1053 <span class="keyword">double</span> <span class="identifier">value</span><span class="special">;</span> <span class="comment">// public data</span> 1054 <span class="keyword">private</span><span class="special">:</span> 1055 <span class="special">...</span> 1056<span class="special">};</span> 1057</pre> 1058<p> 1059 A corresponding Boost.Python extension class can be created with: 1060 </p> 1061<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> 1062 1063<span class="identifier">class_</span><span class="special"><</span><span class="identifier">Foo</span><span class="special">,</span><span class="identifier">bases</span><span class="special"><</span><span class="identifier">Bar</span><span class="special">,</span><span class="identifier">Baz</span><span class="special">></span> <span class="special">>(</span><span class="string">"Foo"</span><span class="special">,</span> 1064 <span class="string">"This is Foo's docstring."</span> 1065 <span class="string">"It describes our Foo extension class"</span><span class="special">,</span> 1066 1067 <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">"__init__ docstring"</span><span class="special">)</span> 1068 <span class="special">)</span> 1069 <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> 1070 <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"get_name"</span><span class="special">,</span> <span class="special">&</span><span class="identifier">Foo</span><span class="special">::</span><span class="identifier">get_name</span><span class="special">,</span> <span class="identifier">return_internal_reference</span><span class="special"><>())</span> 1071 <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="string">"set_name"</span><span class="special">,</span> <span class="special">&</span><span class="identifier">Foo</span><span class="special">::</span><span class="identifier">set_name</span><span class="special">)</span> 1072 <span class="special">.</span><span class="identifier">def_readwrite</span><span class="special">(</span><span class="string">"value"</span><span class="special">,</span> <span class="special">&</span><span class="identifier">Foo</span><span class="special">::</span><span class="identifier">value</span><span class="special">);</span> 1073</pre> 1074</div> 1075</div> 1076</div> 1077<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 1078<td align="left"></td> 1079<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p> 1080 Distributed under the Boost Software License, Version 1.0. (See accompanying 1081 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> 1082 </p> 1083</div></td> 1084</tr></table> 1085<hr> 1086<div class="spirit-nav"> 1087<a accesskey="p" href="concepts/objectwrapper.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="high_level_components/boost_python_def_hpp.html"><img src="../images/next.png" alt="Next"></a> 1088</div> 1089</body> 1090</html> 1091