Re: [pygccxml-development] special functions/operators
Brought to you by:
mbaas,
roman_yakovenko
From: Neal B. <ndb...@gm...> - 2006-08-28 12:30:16
|
On Friday 25 August 2006 1:06 pm, Matthias Baas wrote: > Roman Yakovenko wrote: > > On 8/25/06, Neal Becker <ndb...@gm...> wrote: > >> Is there a way to add special functions/operators to a class? > >> > >> For example: > >> > >> struct X {}; > >> X& addAssign (X& x1, X const& x2) { return x1; } // silly example > >> > >> I want this to do: > >> .def ("__iadd__", addAssign, return_self<>()) > > > > I think that if you rename addAssign to __iadd__ this will work, but I > > am not sure. > > > > mb.free_function( 'addAssign' ).rename( '__iadd__' ) > > I think this would only work when addAssign() was a member of X. > > I'm doing such things with the cdef() method of pypp_api which is > equivalent to adding a raw def() statement to the class (I just had to > name it something else because "def" is already a Python keyword). Usage > of cdef is almost identical to Boost.Python's def. The first argument is > the Python name, then comes the C/C++ function (as a string), followed > by optional policies, args and doc string in arbitrary order. In the > above example, it would look like this: > > root.Class("X").cdef("__iadd__", "addAssign", return_self()) > One of the really cool things about boost::python is that you can not only wrap c++ classes, but synthesize new functionality. Specifically, you can make python classes that don't have c++ equivalents, or add features to python classes that don't exist in the c++ class. We can indeed use cdef for this, but it's rather low level. I wonder if we can make a better api for this, maybe something like: add_method (...) |