Re: [pygccxml-development] special functions/operators
Brought to you by:
mbaas,
roman_yakovenko
|
From: Neal B. <ndb...@gm...> - 2006-08-25 18:10:10
|
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())
>
> (see https://realityforge.vrsource.org/view/PyppApi/Pypp_decorating)
>
Doesn't seem to work though, return_self isn't passed to generated code:
mod = ModuleBuilder(
headerFiles = "world.h",
moduleName = "world"
)
root = mod.parse()
root.Class("World").expose()
root.Class("X").expose()
root.Function ("F1").expose()
root.Class ("A").expose()
root.Class ("B").expose()
root.Class ("Z").expose()
##root.Function ("plusAssignOp").expose()
root.Class("X").cdef("__iadd__", "addAssign", return_self())
mod.writeModule()
generates:
[...]
bp::class_< X >( "X", bp::init< boost::shared_ptr<int> >((
bp::arg("_i") ))[bp::default_call_policies()] )
.def_readwrite( "i", &X::i )
.def( "__iadd__", addAssign ); <<< missing return_self()
|