c++boost.gif (8819 bytes)

A Peek Under the Hood

extension_class<T> is a subclass of PyTypeObject, the struct which Python's 'C' API uses to describe a type. An obj of the extension_class<> becomes the Python type object corresponding to hello::world. When we add it to the module it goes into the module's dictionary to be looked up under the name "world".

Py_cpp uses C++'s template argument deduction mechanism to determine the types of arguments to functions (except constructors, for which we must provide an argument list because they can't be named in C++). Then, it calls the appropriate overloaded functions PyObject* to_python(S) and S'from_python(PyObject*, type<S>) which convert between any C++ type S and a PyObject*, the type which represents a reference to any Python object in its 'C' API. The extension_class<T> template defines a whole raft of these conversions (for T, T*, T&, std::auto_ptr<T>, etc.), using the same inline friend function technique employed by the boost operators library.

Because the to_python and from_python functions for a user-defined class are defined by extension_class<T>, it is important that an instantiation of extension_class<T> is visible to any code which wraps a C++ function with a T, T*, const T&, etc. parameter or return value. In particular, you may want to create all of the classes at the top of your module's init function, then def the member functions later to avoid problems with inter-class dependencies.

Previous: function Overloading Next: Building a module_builder with Py_cpp Up: Top

© Copyright David Abrahams 2000. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Updated: Sept 30, 2000