on Fri Apr 13 2012, John Reid <j.reid-AT-mail.cryst.bbk.ac.uk> wrote:
> Hi,
>
> If I want to define the same class (Inner) in 2 different scopes
> (Outer1 and Outer 2), I can do it like this:
>
> #include <boost/python.hpp>
>
> struct Outer1 {};
> struct Outer2 {};
> struct Inner {};
>
> BOOST_PYTHON_MODULE( _sandbox )
> {
> namespace bp = ::boost::python;
> {
> bp::scope scope = bp::class_< Outer1 >( "Outer1" );
> bp::class_< Inner >( "Inner" );
> }
>
> {
> bp::scope scope = bp::class_< Outer2 >( "Outer2" );
> bp::class_< Inner >( "Inner" );
> }
> }
>
> Unfortunately when I import the _sandbox module I get the standard error:
>
> RuntimeWarning: to-Python converter for Inner already registered;
> second conversion method ignored.
>
> and in debug build the second Inner registration asserts.
You can't do this; don't even try. Each C++ class has to have a unique
Python identity. If you just want to refer to the same class by a
different name, you can of course:
BOOST_PYTHON_MODULE( _sandbox )
{
namespace bp = ::boost::python;
object inner;
{
bp::scope scope = bp::class_< Outer1 >( "Outer1" );
inner = bp::class_< Inner >( "Inner" );
}
{
object outer2 = bp::class_< Outer2 >( "Outer2" );
outer2.attr("Inner") = inner;
}
}
> Is there any way to test if Inner is already registered and if so just
> place it in the correct scope? Perhaps replacing the second scoped
> block with something like this:
>
> {
> bp::object class_Outer2 = bp::class_< Outer2 >( "Outer2" );
> bp::type_info info = boost::python::type_id< Inner >();
> const bp::converter::registration * reg =
> bp::converter::registry::query( info );
> if( NULL == reg ) {
> bp::class_< Inner >( "Inner" );
> } else {
> // Some magic here!
> }
> }
>
> Also I should say that the 2 scoped blocks of code aren't adjacent in
> my library so I don't really want to pass objects between them. I'm
> hoping for a solution that just extracts info from the boost.python
> registry.
BOOST_PYTHON_MODULE( _sandbox )
{
namespace bp = ::boost::python;
{
bp::scope scope = bp::class_< Outer1 >( "Outer1" );
bp::class_< Inner >( "Inner" );
}
{
object outer2 = bp::class_< Outer2 >( "Outer2" );
outer2.attr("Inner") = scope().attr("Outer1").attr("Inner");
}
}
HTH-ly y'rs,
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig