Discussion:
[C++-sig] Boost.Python: C++ object in python: Cannot add to C++ base class list.
Christoff Kok
2015-10-09 07:33:18 UTC
Permalink
Hi,

I am trying to extend existing C++ objects in Python via inheritance.
I can do this successfully and run virtual methods overridden in Python.
When I however, try to add the python object to a list of pointers of the
C++ Base object type(the Base object the python class has overridden), I
get a type error: 'Attempting to append an invalid type'

I am sure this error is due to there begin no 'implicitly_convertible'
functionality from derived* to base*. In C++, this would be defined as so:
implicitly_convertible<[Derived_from_base]*,Base*>();.
Is it possible to define this in python?

How can I achieve this?

Here is sample code reproducing this behaviour.

*C++*

struct Base {
virtual ~Base() {}
virtual int f() = 0;
};
struct A {
std::vector<Base*>& GetBaseList() { return m_base_List; }
std::vector<Base*> m_base_List;
};
struct BaseWrap : Base, wrapper<Base> {
int f() { return this->get_override("f")(); }
};

BOOST_PYTHON_MODULE(sandbox)
{
class_<BaseWrap, Base*, boost::noncopyable>("Base", no_init)
.def("f", pure_virtual(&Base::f));

class_<A, A*>("A", init<>())
.add_property("baseList", make_function(&A::GetBaseList,
return_internal_reference<>()));

//implicitly_convertible<[Derived_from_base]*,Base*>();

class_<std::vector<Base*>>("BaseList").def(vector_indexing_suite<std::vector<Base*>>());
}


*Python*

from sandbox import *


class derived(Base):

def __init__(self):

self.name = "test"

def f(self):

print("Hello Derived!")


d = derived()

d.f() # Output: Hello Derived!


a = A()

a.baseList.append(d) # TypeError: Attempting to append an invalid type



Any help or ideas will be greatly appreciated.

Regards,
Christoff

Loading...