<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <meta name="generator" content="Microsoft FrontPage 5.0"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="../boost.css"> <title>Boost.Python - <boost/python/def_visitor.hpp></title> <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="../../../../c++boost.gif" border="0"></a></h3> <td valign="top"> <h1 align="center"><a href="../index.html"><font size="7">Boost.Python</font></a></h1> <h2 align="center">Header <boost/python/def_visitor.hpp></h2> </table> <hr> <h2>Contents</h2> <dl class="page-index"> <dt><a href="#introduction">Introduction</a> <dt><a href="#classes">Classes</a> <dd> <dl class="page-index"> <dt><a href="#def_visitor-spec">Class <code>def_visitor</code></a> <dd> <a href="#def_visitor-synopsis">Class <code>def_visitor</code> synopsis</a></dd> <dd> <a href="#def_visitor-requirements">Class <code>def_visitor</code> requirements</a></dd> </dl> <dt><a href="#examples">Example</a> </dl> <hr> <h2><a name="introduction"></a>Introduction</h2> <p><code><boost/python/def_visitor.hpp></code> provides a generic visitation interface through which the <a href="class.html">class_</a> <b>def</b> member functionality can be extended non-intrusively to avoid cluttering the <a href="class.html">class_</a> interface. It declares the <code>def_visitor<T> </code>class template, which is parameterized on the derived type <tt>DerivedVisitor</tt>, which provides the actual <b>def</b> functionality through its <b>visit</b> member functions. <h2><a name="classes"></a>Classes</h2> <h3><a name="def_visitor-spec"></a>Class template <code>def_visitor<DerivedVisitor></code></h3> <p>The class def_visitor is a base class paramaterized by its derived class. The def_visitor class is a protocol class. Its derived class, DerivedVisitor, is expected to have a member function visit. The def_visitor class is never instantiated directly. Instead, an instance of its subclass, DerivedVisitor, is passed on as an argument to the <a href="class.html">class_</a> def member function. <h4> <a name="def_visitor-synopsis" id="def_visitor-synopsis"></a>Class <code>def_visitor </code>synopsis</h4> <pre>namespace boost { namespace python { template <class DerivedVisitor> class def_visitor {}; }</pre> <h3><a name="def_visitor-requirements"></a><code>def_visitor </code>requirements</h3> <p>The <span class="pre">client supplied class </span><span class="pre"></span><tt class="literal"><span class="pre">DerivedVisitor</span></tt> template parameter is expected to: <ul> <li>be privately derived from def_visitor</li> <li>grant friend access to class def_visitor_access</li> <li>define either or both visit member functions listed in the table below:</li> </ul> <table border class="table"> <tr> <td width="181" nowrap><b>Expression</b></td> <td width="85"><b>Return Type</b></td> <td width="330"><b>Requirements</b></td> <td width="259"><b>Effects</b></td> </tr> <tr> <td nowrap>visitor.visit(cls)</td> <td>void</td> <td>cls is an instance of a <a href="class.html">class_</a> being wrapped to Python. visitor is a def_visitor derived class.</td> <td>A call to cls.def(visitor) forwards to this member function.</td> </tr> <tr> <td nowrap>visitor.visit(cls, name, options)</td> <td>void</td> <td>cls is a class_ instance, name is a C string. visitor is a def_visitor derived class. options is a context specific optional argument.</td> <td>A call to cls.def(name, visitor) or cls.def(name, visitor, options) forwards to this member function. </td> </tr> </table> <h2><a name="examples"></a>Example</h2> <pre>class X {/*...*/};<br> class my_def_visitor : boost::python::def_visitor<my_def_visitor> { friend class def_visitor_access; template <class classT> void visit(classT& c) const { c .def("foo", &my_def_visitor::foo) .def("bar", &my_def_visitor::bar) ; } static void foo(X& self); static void bar(X& self); }; BOOST_PYTHON_MODULE(my_ext) { class_<X>("X") .def(my_def_visitor()) ; } </pre> <p>Revised <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->27 August, 2003<!--webbot bot="Timestamp" endspan i-checksum="34484" --> </p> <p><i>© Copyright Joel de Guzman 2003. All Rights Reserved.</i>