Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 623999701586b0ea103ff2ccad7954a6 > files > 9491

boost-doc-1.44.0-1.fc14.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!-- Copyright David Abrahams 2006. Distributed under the Boost -->
<!-- Software License, Version 1.0. (See accompanying -->
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
<html>
<head>
  <meta name="generator" content=
  "HTML Tidy for Cygwin (vers 1st September 2004), see www.w3.org">
  <meta http-equiv="Content-Type" content="text/html; charset=iso-latin-1-dos">
  <link rel="stylesheet" type="text/css" href="../boost.css">

  <title>Boost.Python - &lt;boost/python/class.hpp&gt;,
  &lt;boost/python/class_fwd.hpp&gt;</title>
</head>

<body link="#0000FF" vlink="#800080">
  <table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
  "header">
    <tr>
      <td valign="top" width="300">
        <h3><a href="../../../../index.htm"><img height="86" width="277" alt=
        "C++ Boost" src="../../../../boost.png" border="0"></a></h3>
      </td>

      <td valign="top">
        <h1 align="center"><a href="../index.html">Boost.Python</a></h1>

        <h2 align="center">Headers &lt;boost/python/class.hpp&gt;,
        &lt;boost/python/class_fwd.hpp&gt;</h2>
      </td>
    </tr>
  </table>
  <hr>

  <h2>Contents</h2>

  <dl class="page-index">
    <dt><a href="#introduction">Introduction</a></dt>

    <dt><a href="#classes">Classes</a></dt>

    <dd>
      <dl class="page-index">
        <dt><a href="#class_-spec">Class template
        <code>class_</code></a></dt>

        <dd>
          <dl class="page-index">
            <dt><a href="#class_-spec-synopsis">Class <code>class_</code>
            synopsis</a></dt>

            <dt><a href="#class_-spec-ctors">Class <code>class_</code>
            constructors</a></dt>

            <dt><a href="#class_-spec-modifiers">Class <code>class_</code>
            modifier functions</a></dt>
          </dl>
        </dd>

        <dt><a href="#bases-spec">Class template <code>bases</code></a></dt>

        <dd>
          <dl class="page-index">
            <dt><a href="#bases-spec-synopsis">Class template
            <code>bases</code> synopsis</a></dt>
          </dl>
        </dd>
      </dl>
    </dd>

    <dt><a href="#examples">Example(s)</a></dt>
  </dl>
  <hr>

  <h2><a name="introduction" id="introduction"></a>Introduction</h2>

  <p><code>&lt;boost/python/class.hpp&gt;</code> defines the interface
  through which users expose their C++ classes to Python. It declares the
  <code>class_</code> class template, which is parameterized on the class
  type being exposed. It also exposes the <code>init</code>,
  <code>optional</code> and <code>bases</code> utility class templates, which
  are used in conjunction with <code>class_</code>.</p>

  <p><code>&lt;boost/python/class_fwd.hpp&gt;</code> contains a forward
  declaration of the <code>class_</code> class template.</p>

  <h2><a name="classes" id="classes"></a>Classes</h2>

  <h3><a name="class_-spec" id="class_-spec"></a>Class template
  <code>class_&lt;T,&nbsp;<font color="#007F00">Bases,&nbsp;HeldType,
  NonCopyable</font>&gt;</code></h3>

  <p>Creates a Python class associated with the C++ type passed as its first
  parameter. Although it has four template parameters, only the first one is
  required. The three optional arguments can actually be supplied
  <font color="#007F00"><b>in any order</b></font>; Boost.Python determines
  the role of the argument from its type.<br>
  <br></p>

  <table border="1" summary="class_ template parameters">
    <tr>
      <th>Template Parameter</th>

      <th>Requirements</th>

      <th>Semantics</th>

      <th>Default</th>
    </tr>

    <tr>
      <td><code>T</code></td>

      <td>A class type.</td>

      <td>The class being wrapped</td>
    </tr>

    <tr>
      <td><code><font color="#007F00">Bases</font></code></td>

      <td>A specialization of <a href=
      "#bases-spec"><code>bases&lt;</code>...<code>&gt;</code></a> which
      specifies previously-exposed C++ base classes of <code>T</code><a href=
      "#footnote_1">[1]</a>.</td>

      <td>Registers <code>from_python</code> conversions from wrapped
      <code>T</code> instances to each of its exposed direct and indirect
      bases. For each polymorphic base <code>B</code>, registers conversions
      from indirectly-held wrapped <code>B</code> instances to
      <code>T</code>.</td>

      <td><code><a href="#bases-spec">bases&lt;&gt;</a></code></td>
    </tr>

    <tr>
      <td><code><font color="#007F00">HeldType</font></code></td>

      <td>Must be <code>T</code>, a class derived from <code>T</code>, or a
      <a href="Dereferenceable.html">Dereferenceable</a> type for which
      <code><a href=
      "pointee.html#pointee-spec">pointee</a>&lt;HeldType&gt;::type</code> is
      <code>T</code> or a class derived from <code>T</code>.</td>

      <td>Specifies the type that is actually embedded in a Python object
      wrapping a <code>T</code> instance when <code>T</code>'s constructor is
      called or when a <code>T</code> or <code>T*</code> is converted to
      Python without the use of <a href=
      "http://www.boost.org/libs/python/doc/v2/callbacks.html#argument_handling">
      <code>ptr</code></a>, <a href=
      "http://www.boost.org/libs/python/doc/v2/callbacks.html#argument_handling">
      <code>ref</code></a>, or <a href="CallPolicies.html">Call Policies</a>
      such as <code><a href=
      "return_internal_reference.html">return_internal_reference</a></code>.
      More details <a href="#HeldType">below</a>.</td>

      <td><code>T</code></td>
    </tr>

    <tr>
      <td><code><font color="#007F00">NonCopyable</font></code></td>

      <td>If supplied, must be <a href=
      "../../../utility/utility.htm#Class_noncopyable">boost::noncopyable</a>.</td>

      <td>Suppresses automatic registration of <code>to_python</code>
      conversions which copy <code>T</code> instances. Required when
      <code>T</code> has no publicly-accessible copy constructor.</td>

      <td>An unspecified type other than
      <code>boost::noncopyable</code>.</td>
    </tr>
  </table>

  <h4><a name="HeldType" id="HeldType">HeldType Semantics</a></h4>

  <ol>
    <li>If <code>HeldType</code> is derived from T, its exposed
    constructor(s) must accept an initial <code>PyObject*</code> argument
    which refers back to the Python object that contains the
    <code>HeldType</code> instance, as shown in <a href=
    "call_method.html#examples">this example</a>. This argument is not
    included in the <em><a href=
    "init.html#init-expressions">init-expression</a></em> passed to <a href=
    "#class_-spec-modifiers"><code>def(init_expr)</code></a>, below, nor is
    it passed explicitly by users when Python instances of <code>T</code> are
    created. This idiom allows C++ virtual functions which will be overridden
    in Python to access the Python object so the Python method can be
    invoked. Boost.Python automatically registers additional converters which
    allow wrapped instances of <code>T</code> to be passed to wrapped C++
    functions expecting <code>HeldType</code> arguments.</li>

    <li>Because Boost.Python will always allow wrapped instances of
    <code>T</code> to be passed in place of <code>HeldType</code> arguments,
    specifying a smart pointer for <code>HeldType</code> allows users to pass
    Python <code>T</code> instances where a smart pointer-to-<code>T</code>
    is expected. Smart pointers such as <code>std::auto_ptr&lt;&gt;</code> or
    <code><a href=
    "../../../smart_ptr/shared_ptr.htm">boost::shared_ptr&lt;&gt;</a></code>
    which contain a nested type <code>element_type</code> designating the
    referent type are automatically supported; additional smart pointer types
    can be supported by specializing <a href=
    "pointee.html#pointee-spec">pointee&lt;HeldType&gt;</a>.</li>

    <li>As in case 1 above, when <code>HeldType</code> is a smart pointer to
    a class derived from <code>T</code>, the initial <code>PyObject*</code>
    argument must be supplied by all of <code>HeldType</code>'s exposed
    constructors.</li>

    <li>Except in cases 1 and 3, users may optionally specify that T itself
    gets initialized with a similar initial <code>PyObject*</code> argument
    by specializing <a href=
    "has_back_reference.html#has_back_reference-spec">has_back_reference&lt;T&gt;</a>.</li>
  </ol>

  <h4><a name="class_-spec-synopsis" id="class_-spec-synopsis"></a>Class
  template <code>class_</code> synopsis</h4>
  <pre>
namespace boost { namespace python
{
  template &lt;class T
   <font color="#007F00">   , class Bases = bases&lt;&gt;
            , class HeldType = T
            , class NonCopyable = <i>unspecified</i>
           &gt;
</font>  class class_ : public <a href="object.html#object-spec">object</a>
  {
    // Constructors with default __init__
    class_(char const* name);
    class_(char const* name, char const* docstring);

    // Constructors, specifying non-default __init__
    template &lt;class Init&gt;
    class_(char const* name, Init);
    template &lt;class Init&gt;
    class_(char const* name, char const* docstring, Init);

    // Exposing additional __init__ functions
    template &lt;class Init&gt;
    class_&amp; def(Init);

    // defining methods
    template &lt;class F&gt;
    class_&amp; def(char const* name, F f);
    template &lt;class Fn, class A1&gt;
    class_&amp; def(char const* name, Fn fn, A1 const&amp;);
    template &lt;class Fn, class A1, class A2&gt;
    class_&amp; def(char const* name, Fn fn, A1 const&amp;, A2 const&amp;);
    template &lt;class Fn, class A1, class A2, class A3&gt;
    class_&amp; def(char const* name, Fn fn, A1 const&amp;, A2 const&amp;, A3 const&amp;);

    // declaring method as static
    class_&amp; staticmethod(char const* name);
    
    // exposing operators
    template &lt;<i>unspecified</i>&gt;
    class_&amp; def(<a href=
"operators.html#operator_-spec">detail::operator_</a>&lt;unspecified&gt;);

    // Raw attribute modification
    template &lt;class U&gt;
    class_&amp; setattr(char const* name, U const&amp;);

    // exposing data members
    template &lt;class D&gt;
    class_&amp; def_readonly(char const* name, D T::*pm);

    template &lt;class D&gt;
    class_&amp; def_readwrite(char const* name, D T::*pm);

    // exposing static data members
    template &lt;class D&gt;
    class_&amp; def_readonly(char const* name, D const&amp; d);
    template &lt;class D&gt;
    class_&amp; def_readwrite(char const* name, D&amp; d);

    // property creation
    template &lt;class Get&gt;
    void add_property(char const* name, Get const&amp; fget, char const* doc=0);
    template &lt;class Get, class Set&gt;
    void add_property(
        char const* name, Get const&amp; fget, Set const&amp; fset, char const* doc=0);

    template &lt;class Get&gt;
    void add_static_property(char const* name, Get const&amp; fget);
    template &lt;class Get, class Set&gt;
    void add_static_property(char const* name, Get const&amp; fget, Set const&amp; fset);

    // pickle support
    template &lt;typename PickleSuite&gt;
    self&amp; def_pickle(PickleSuite const&amp;);
    self&amp; enable_pickling();
  };
}}
</pre>

  <h4><a name="class_-spec-ctors" id="class_-spec-ctors"></a>Class template
  <code>class_</code> constructors</h4>
  <pre>
class_(char const* name);
class_(char const* name, char const* docstring);
template &lt;class Init&gt;
class_(char const* name, Init init_spec);
template &lt;class Init&gt;
class_(char const* name, char const* docstring, Init init_spec);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>. If <code>docstring</code> is supplied, it must be an
    <a href="definitions.html#ntbs">ntbs</a>. If <code>init_spec</code> is
    supplied, it must be either the special enumeration constant
    <code>no_init</code> or an <a href=
    "init.html#init-expressions">init-expression</a> compatible with
    <code>T</code>.</dt>

    <dt><b>Effects:</b> Constructs a <code>class_</code> object holding a
    Boost.Python extension class named <code>name</code>. The
    <code>name</code>d attribute of the <a href=
    "scope.html#introduction">current scope</a> is bound to the new extension
    class.</dt>

    <dd>
      <ul>
        <li>If supplied, the value of <code>docstring</code> is bound to the
        <code>__doc__</code> attribute of the extension class.</li>

        <li>If <code>init_spec</code> is <code>no_init</code>, a special
        <code>__init__</code> function is generated which always raises a
        Python exception. Otherwise, <code>this-&gt;def(init_spec)</code> is
        called.</li>

        <li>If <code>init_spec</code> is not supplied,
        <code>this-&gt;def(init&lt;&gt;())</code> is called.</li>
      </ul>
    </dd>

    <dt><b>Rationale:</b>Allowing the user to specify constructor arguments
    in the <code>class_&lt;&gt;</code> constructor helps her to avoid the
    common run-time errors which result from invoking wrapped member
    functions without having exposed an <code>__init__</code> function which
    creates the requisite <code>T</code> instance. Types which are not
    default-constructible will cause a compile-time error unless
    <code>Init</code> is supplied. The user must always supply
    <code>name</code> as there is currently no portable method to derive the
    text of the class name from its type.</dt>
  </dl>

  <h4><a name="class_-spec-modifiers" id="class_-spec-modifiers"></a>Class
  template <code>class_</code> modifier functions</h4>
  <pre>
template &lt;class Init&gt;
class_&amp; def(Init init_expr);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>init_expr</code> is the result of an <a href=
    "init.html#init-expressions">init-expression</a> compatible with
    <code>T</code>.</dt>

    <dt><b>Effects:</b> For each <a href="init.html#init-expressions">valid
    prefix</a> <em>P</em> of <code>Init</code>, adds an
    <code>__init__(</code>...<code>)</code> function overload to the
    extension class accepting <em>P</em> as arguments. Each overload
    generated constructs an object of <code>HeldType</code> according to the
    semantics described <a href="#HeldType">above</a>, using a copy of
    <code>init_expr</code>'s <a href="CallPolicies.html">call policies</a>.
    If the longest <a href="init.html#init-expressions">valid prefix</a> of
    <code>Init</code> contains <em>N</em> types and <code>init_expr</code>
    holds <em>M</em> keywords, an initial sequence of the keywords are used
    for all but the first <em>N</em> - <em>M</em> arguments of each
    overload.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Allows users to easily expose a class' constructor
    to Python.</dt>
  </dl><br>
  <pre>
template &lt;class F&gt;
class_&amp; def(char const* name, Fn fn);
template &lt;class Fn, class A1&gt;
class_&amp; def(char const* name, Fn fn, A1 const&amp; a1);
template &lt;class Fn, class A1, class A2&gt;
class_&amp; def(char const* name, Fn fn, A1 const&amp; a1, A2 const&amp; a2);
template &lt;class Fn, class A1, class A2, class A3&gt;
class_&amp; def(char const* name, Fn fn, A1 const&amp; a1, A2 const&amp; a2, A3 const&amp; a3);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>.</dt>

    <dd>
      <ul>
        <li>If <code>a1</code> is the result of an <a href=
        "overloads.html#overload-dispatch-expression"><em>overload-dispatch-expression</em></a>,
        only the second form is allowed and fn must be a pointer to function
        or pointer to member function whose <a href="definitions.html#arity">
          arity</a> is the same as A1's <a href=
          "overloads.html#overload-dispatch-expression"><em>maximum
          arity</em></a>.

          <dl>
            <dt><b>Effects:</b> For each prefix <em>P</em> of
            <code>Fn</code>'s sequence of argument types, beginning with the
            one whose length is <code>A1</code>'s <a href=
            "overloads.html#overload-dispatch-expression"><em>minimum
            arity</em></a>, adds a
            <code><em>name</em>(</code>...<code>)</code> method overload to
            the extension class. Each overload generated invokes
            <code>a1</code>'s call-expression with <em>P</em>, using a copy
            of <code>a1</code>'s <a href="CallPolicies.html">call
            policies</a>. If the longest valid prefix of <code>A1</code>
            contains <em>N</em> types and <code>a1</code> holds <em>M</em>
            keywords, an initial sequence of the keywords are used for all
            but the first <em>N</em> - <em>M</em> arguments of each
            overload.<br></dt>
          </dl>
        </li>

        <li>Otherwise, a single method overload is built around fn, which
        must not be null:

          <ul>
            <li>If fn is a function pointer, its first argument must be of
            the form <code>U</code>, <code>U <em>cv</em>&amp;</code>, <code>U
            <em>cv</em>*</code>, or <code>U <em>cv</em>* const&amp;</code>,
            where <code>T*</code> is convertible to <code>U*</code>, and
            <code>a1</code>-<code>a3</code>, if supplied, may be selected in
            any order from the table below.</li>

            <li>Otherwise, if fn is a member function pointer, its target
            must be <code>T</code> or one of its public base classes, and
            <code>a1</code>-<code>a3</code>, if supplied, may be selected in
            any order from the table below.</li>

            <li>Otherwise, <code>Fn</code> must be [derived from]
            <code><a href="object.html#object-spec">object</a></code>, and
            <code>a1-a2</code>, if supplied, may be selcted in any order from
            the first two rows of the table below. To be useful,
            <code>fn</code> should be <a href=
            "http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-6">
            callable</a>.</li>
          </ul>

          <table border="1" summary="def() optional arguments">
            <tr>
              <th>Memnonic Name</th>

              <th>Requirements/Type properties</th>

              <th>Effects</th>
            </tr>

            <tr>
              <td>docstring</td>

              <td>Any <a href="definitions.html#ntbs">ntbs</a>.</td>

              <td>Value will be bound to the <code>__doc__</code> attribute
              of the resulting method overload. If an earlier overload
              supplied a docstring, two newline characters and the new
              docstring are appended to it.</td>
            </tr>

            <tr>
              <td>policies</td>

              <td>A model of <a href=
              "CallPolicies.html">CallPolicies</a></td>

              <td>A copy will be used as the call policies of the resulting
              method overload.</td>
            </tr>

            <tr>
              <td>keywords</td>

              <td>The result of a <a href=
              "args.html#keyword-expression"><em>keyword-expression</em></a>
              specifying no more arguments than the <a href=
              "definitions.html#arity">arity</a> of <code>fn</code>.</td>

              <td>A copy will be used as the call policies of the resulting
              method overload.</td>
            </tr>
          </table>
        </li>
      </ul>
    </dd>

    <dt><b>Returns:</b> <code>*this</code></dt>
  </dl>
  <pre>
class_&amp; staticmethod(char const* name);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>, and corresponds to a method whose overloads have all
    been defined.</dt>

    <dt><b>Effects:</b> Replaces the existing named attribute <i>x</i> with
    the result of invoking <code>staticmethod(</code><i>x</i><code>)</code>
    in Python. Specifies that the corresponding method is static and
    therefore no object instance will be passed to it. This is equivalent to
    the Python statement:</dt>

    <dd>
      <pre>
setattr(self, name, staticmethod(getattr(self, name)))
</pre>
    </dd>

    <dt><b>Note:</b> Attempting to invoke <code>def(name,...)</code> after
    invoking <code>staticmethod(name)</code> will <a href=
    "definitions.html#raise">raise</a> a RuntimeError.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>
  </dl><br>
  <pre>
template &lt;<i>unspecified</i>&gt;
class_&amp; def(<a href=
"operators.html#operator_-spec">detail::operator_</a>&lt;unspecified&gt;);
</pre>

  <dl class="function-semantics">
    <dt><b>Effects:</b> Adds a Python <a href=
    "http://www.python.org/doc/ref/specialnames.html">special method</a> as
    described <a href="operators.html">here</a>.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>
  </dl>
  <pre>
template &lt;class U&gt;
class_&amp; setattr(char const* name, U const&amp; u);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>.</dt>

    <dt><b>Effects:</b> Converts u to Python and adds it to the attribute
    dictionary of the extension class:</dt>

    <dd>
      <blockquote>
        <code><a href=
        "http://www.python.org/doc/current/api/object.html#l2h-166">PyObject_SetAttrString</a>(this-&gt;ptr(),
        name, <a href=
        "object.html#object-spec-ctors">object</a>(u).ptr());</code>
      </blockquote>
    </dd>

    <dt><b>Returns:</b> <code>*this</code></dt>
  </dl><br>
  <pre>
template &lt;class Get&gt;
void add_property(char const* name, Get const&amp; fget, char const* doc=0);
template &lt;class Get, class Set&gt;
void add_property(
        char const* name, Get const&amp; fget, Set const&amp; fset, char const* doc=0);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conform to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>.</dt>

    <dt><b>Effects:</b> Creates a new Python <a href=
    "http://www.python.org/2.2.2/descrintro.html#property"><code>property</code></a>
    class instance, passing <code><a href=
    "object.html#object-spec-ctors">object</a>(fget)</code> (and
    <code><a href="object.html#object-spec-ctors">object</a>(fset)</code> in
    the second form) with an (optional) docstring <code>doc</code> to its
    constructor, then adds that property to the Python class object under
    construction with the given attribute <code>name</code>.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Allows users to easily expose functions that can be
    invoked from Python with attribute access syntax.</dt>
  </dl><br>
  <pre>
template &lt;class Get&gt;
void add_static_property(char const* name, Get const&amp; fget);
template &lt;class Get, class Set&gt;
void add_static_property(char const* name, Get const&amp; fget, Set const&amp; fset);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>.</dt>

    <dt><b>Effects:</b> Creates a Boost.Python.StaticProperty object, passing
    <code><a href="object.html#object-spec-ctors">object</a>(fget)</code>
    (and <code><a href=
    "object.html#object-spec-ctors">object</a>(fset)</code> in the second
    form) to its constructor, then adds that property to the Python class
    under construction with the given attribute <code>name</code>.
    StaticProperty is a special subclass of Python's <a href=
    "http://www.python.org/2.2.2/descrintro.html#property"><code>property</code></a>
    class which can be called without an initial <code>self</code>
    argument.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Allows users to easily expose functions that can be
    invoked from Python with static attribute access syntax.</dt>
  </dl><br>
  <pre>
template &lt;class D&gt;
class_&amp; def_readonly(char const* name, D T::*pm, char const* doc=0);
template &lt;class D&gt;
class_&amp; def_readonly(char const* name, D const&amp; d);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> <code>name</code> is an <a href=
    "definitions.html#ntbs">ntbs</a> which conforms to Python's <a href=
    "http://www.python.org/doc/current/ref/identifiers.html">identifier
    naming rules</a>. <code>doc</code> is also an ntbs.</dt>

    <dt><b>Effects:</b></dt>

    <dd>
      <pre>
this-&gt;add_property(name, <a href=
"data_members.html#make_getter-spec">make_getter</a>(pm), doc);
</pre>and
      <pre>
this-&gt;add_static_property(name, <a href=
"data_members.html#make_getter-spec">make_getter</a>(d));
</pre>respectively.<br>
      <br>
    </dd>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Allows users to easily expose a class' data member
    or free variable such that it can be inspected from Python with a natural
    syntax.</dt>
  </dl>
  <pre>
template &lt;class D&gt;
class_&amp; def_readwrite(char const* name, D T::*pm, char const* doc=0);
template &lt;class D&gt;
class_&amp; def_readwrite(char const* name, D&amp; d);
</pre>

  <dl class="function-semantics">
    <dt><b>Effects:</b></dt>

    <dd>
      <pre>
this-&gt;add_property(name, <a href=
"data_members.html#make_getter-spec">make_getter</a>(pm), <a href=
"data_members.html#make_setter-spec">make_setter</a>(pm), doc);
</pre>and
      <pre>
this-&gt;add_static_property(name, <a href=
"data_members.html#make_getter-spec">make_getter</a>(d), <a href=
"data_members.html#make_setter-spec">make_setter</a>(d));
</pre>respectively.<br>
      <br>
    </dd>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Allows users to easily expose a class' data or free
    variable member such that it can be inspected and set from Python with a
    natural syntax.</dt>
  </dl>
  <pre>
template &lt;typename PickleSuite&gt;
class_&amp; def_pickle(PickleSuite const&amp;);
</pre>

  <dl class="function-semantics">
    <dt><b>Requires:</b> PickleSuite must be publically derived from <a href=
    "pickle.html"><code>pickle_suite</code></a>.</dt>

    <dt><b>Effects:</b> Defines a legal combination of the special attributes
    and methods: <code>__getinitargs__</code>, <code>__getstate__</code>,
    <code>__setstate__</code>, <code>__getstate_manages_dict__</code>,
    <code>__safe_for_unpickling__</code>, <code>__reduce__</code></dt>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Provides an <a href="pickle.html">easy to use
    high-level interface</a> for establishing complete pickle support for the
    wrapped class. The user is protected by compile-time consistency
    checks.</dt>
  </dl><br>
  <pre>
class_&amp; enable_pickling();
</pre>

  <dl class="function-semantics">
    <dt><b>Effects:</b> Defines the <code>__reduce__</code> method and the
    <code>__safe_for_unpickling__</code> attribute.</dt>

    <dt><b>Returns:</b> <code>*this</code></dt>

    <dt><b>Rationale:</b> Light-weight alternative to
    <code>def_pickle()</code>. Enables implementation of <a href=
    "pickle.html">pickle support</a> from Python.</dt>
  </dl><br>

  <h3><a name="bases-spec" id="bases-spec"></a>Class template
  <code>bases&lt;T1, T2,</code>...<code>TN&gt;</code></h3>

  <p>An <a href="../../../mpl/doc/refmanual/forward-sequence.html">MPL
  sequence</a> which can be used in
  <code>class_&lt;</code>...<code>&gt;</code> instantiations indicate a list
  of base classes.</p>

  <h4><a name="bases-spec-synopsis" id="bases-spec-synopsis"></a>Class
  template <code>bases</code> synopsis</h4>
  <pre>
namespace boost { namespace python
{
  template &lt;T1 = <i>unspecified</i>,...T<i>n</i> = <i>unspecified</i>&gt;
  struct bases
  {};
}}
</pre>

  <h2><a name="examples" id="examples"></a>Example(s)</h2>

  <p>Given a C++ class declaration:</p>
  <pre>
class Foo : public Bar, public Baz
{
 public:
   Foo(int x, char const* y);
   Foo(double);

   std::string const&amp; name() { return m_name; }
   void name(char const*);

   double value; // public data
 private:
   ...
};
</pre>A corresponding Boost.Python extension class can be created with:
  <pre>
using namespace boost::python;

class_&lt;Foo,bases&lt;Bar,Baz&gt; &gt;("Foo",
          "This is Foo's docstring."
          "It describes our Foo extension class",

          init&lt;int,char const*&gt;(args("x","y"), "__init__ docstring")
          )
   .def(init&lt;double&gt;())
   .def("get_name", &amp;Foo::get_name, return_internal_reference&lt;&gt;())
   .def("set_name", &amp;Foo::set_name)
   .def_readwrite("value", &amp;Foo::value)
   ;
</pre>
  <hr>
  <a name="footnote_1" id="footnote_1">[1]</a> By "previously-exposed" we
  mean that the for each <code>B</code> in <code>bases</code>, an instance of
  <code>class_&lt;B<font color="#007F00">, ...</font>&gt;</code> must have
  already been constructed.
  <pre>
class_&lt;Base&gt;("Base");
class_&lt;Derived, bases&lt;Base&gt; &gt;("Derived");
</pre>Revised 
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
   1 November, 2005 <!--webbot bot="Timestamp" endspan i-checksum="39359" -->

  <p><i>&copy; Copyright <a href="http://www.boost.org/people/dave_abrahams.htm">Dave
  Abrahams</a> 2002.</i></p>
</body>
</html>