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 (...)
|