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