[C++-sig] Virtual methods with arguments and boost::cref
Charles Solar
charlessolar at gmail.com
Sun Mar 7 07:23:12 CET 2010
I have some virtual methods with default implementations that I am defining
according the guidelines on the documentation and I ran into some unexpected
behavior.
If I define a virtual method in boost python like so
void receivedMsg( const sl::Message& msg )
{
if( bp::override func_receivedMsg = this->get_override(
"receivedMsg" ) )
func_receivedMsg( boost::cref( msg ) );
}
it works fine, my receivedMsg function gets called in python no problem.
Note that I am not calling the default implementation because the default
implementation does not do anything, I do not want to make them pure virtual
because the idea is that the user only has to define the methods he wants
notifications on.
My trouble comes when I do
void receiverDeleted( const std::string& type, const std::string& name )
{
if( bp::override func_receiverDeleted = this->get_override(
"receiverDeleted" ) )
func_receiverDeleted( boost::cref( type ), boost::cref( name )
);
}
I get a error_already_set exception because the mechanics under the hood
cannot pythonize the boost::cref( type ). In my first example, Message is
defined in python so I guess cref works like that, but the default converter
for std::string must not like the boost::cref wrapper. I do not get the
exception and it seems to work fine if I remove the crefs.
I added the cref's a while ago because it seemed like the right thing to
do. I do not want boost::python creating copies of my objects under the
hood, maybe it does anyway, I do not know.
Do the crefs do anything? Should I even have them? Is this a bug or just
me being stupid? :p
Thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20100307/442aab06/attachment.html>
More information about the Cplusplus-sig
mailing list