Sophie

Sophie

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

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 Windows (vers 1st August 2002), see www.w3.org">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <link rel="stylesheet" type="text/css" href="../boost.css">

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

  <body>
    <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">Header
          &lt;boost/python/reference_existing_object.hpp&gt;</h2>
        </td>
      </tr>
    </table>
    <hr>

    <h2>Contents</h2>

    <dl class="page-index">
      <dt><a href="#classes">Classes</a></dt>

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

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

              <dt><a href=
              "#reference_existing_object-spec-metafunctions">Class
              <code>reference_existing_object</code> metafunctions</a></dt>
            </dl>
          </dd>
        </dl>
      </dd>

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

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

    <h3><a name="reference_existing_object-spec"></a>Class
    <code>reference_existing_object</code></h3>

    <p><code>reference_existing_object</code> is a model of <a href=
    "ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a>
    which can be used to wrap C++ functions which return a reference or
    pointer to a C++ object. When the wrapped function is called, the value
    referenced by its return value is not copied. A new Python object is
    created which contains a pointer to the referent, and no attempt is made
    to ensure that the lifetime of the referent is at least as long as that
    of the corresponding Python object. Thus, it can be <font color=
    "#ff0000"><b>highly dangerous</b></font> to use
    <code>reference_existing_object</code> without additional lifetime
    management from such models of <a href=
    "CallPolicies.html">CallPolicies</a> as <a href=
    "with_custodian_and_ward.html#with_custodian_and_ward-spec">with_custodian_and_ward</a>.
    This class is used in the implementation of <a href=
    "return_internal_reference.html#return_internal_reference-spec">return_internal_reference</a>.</p>

    <h4><a name="reference_existing_object-spec-synopsis"></a>Class
    <code>reference_existing_object</code> synopsis</h4>
<pre>
namespace boost { namespace python
{
    struct reference_existing_object
    {
        template &lt;class T&gt; struct apply;
    };
}}
</pre>

    <h4><a name="reference_existing_object-spec-metafunctions"></a>Class
    <code>reference_existing_object</code> metafunctions</h4>
<pre>
template &lt;class T&gt; struct apply
</pre>

    <dl class="metafunction-semantics">
      <dt><b>Requires:</b> <code>T</code> is <code>U&amp;</code> or
      <code>U*</code>for some <code>U</code>.</dt>

      <dt><b>Returns:</b> <code>typedef <a href=
      "to_python_indirect.html#to_python_indirect-spec">to_python_indirect</a>&lt;T,V&gt;
      type</code>, where <code>V</code> is a class whose
      static <code>execute</code> function constructs an instance
      holder containing an <i>unowned</i>
      <code>U*</code> pointing to the referent of the wrapped function's
      return value.</dt>
    </dl>

    <h2><a name="examples"></a>Example</h2>

    <p>In C++:</p>
<pre>
#include &lt;boost/python/module.hpp&gt;
#include &lt;boost/python/class.hpp&gt;
#include &lt;boost/python/reference_existing_object.hpp&gt;
#include &lt;boost/python/return_value_policy.hpp&gt;
#include &lt;utility&gt;

// classes to wrap
struct Singleton
{
   Singleton() : x(0) {}

   int exchange(int n)  // set x and return the old value
   {
        std::swap(n, x);
        return n;
   }

   int x;
};

Singleton&amp; get_it()
{
   static Singleton just_one;
   return just_one;
}

// Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(singleton)
{
    def("get_it", get_it,
        return_value_policy&lt;reference_existing_object&gt;());

    class_&lt;Singleton&gt;("Singleton")
       .def("exchange", &amp;Singleton::exchange)
       ;
}
</pre>
    In Python: 
<pre>
&gt;&gt;&gt; import singleton
&gt;&gt;&gt; s1 = singleton.get_it()  
&gt;&gt;&gt; s2 = singleton.get_it()
&gt;&gt;&gt; id(s1) == id(s2)  # s1 and s2 are not the same object
0
&gt;&gt;&gt; s1.exchange(42)   # but they reference the same C++ Singleton
0
&gt;&gt;&gt; s2.exchange(99)
42
</pre>

    <p>Revised 
    <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
  13 November, 2002
  <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
    </p>

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