[C++-sig] indexing suite and py++

Roman Yakovenko roman.yakovenko at gmail.com
Wed Apr 8 23:14:54 CEST 2009


2009/4/8 Michał Nowotka <mmmnow at gmail.com>:
> Hello,

Good evening

> I want to expose following classes:
>
> class A
> {
> public:
>        A(int a, int b)
>        :a_(a),b_(b)
>        {}
>        int a_;
>        int b_;
>
> int compute(){return a_ + b_;}
>
> };
>
> class C : public A
> {
>
> public:
>
>        C(int a, int b)
>        :A(a,b){}
> };
>
> struct TypeExposer // I have to add this class, otherwise Py++ won't
> expose std::deque<C> - why?
> {
>        typedef std::deque<C> CDeque;
>        CDeque deq;
> };

You can read the following documents:
http://language-binding.net/pyplusplus/documentation/how_to/templates.html?highlight=templates
http://language-binding.net/pyplusplus/documentation/how_to/hints.html?highlight=templates

The short answer: gccxml doesn't dump information about template
classes, so you need to instantiate it.

> class F :  public std::deque<C>
> {
>        public:
>                F(){}
>                int dlugosc() {return this->size();}
> };

I am not sure how well Py++ support this use case ( deriving from std
container ). I never had it.

> In order to expose I use Py++ with indexing_suite_version = 2
> parameter. Py++ generates code for boost.python without any warnings
> and generated code compiles well.
> But then in python I get TypeError:
>
> import test
> c = test.C(2,3)
> f = test.F()
> f.append(c)
> f[0]
>
> this causes:
>
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: No to_python (by-value) converter found for C++ type: C
>
> When class C is base class everything works well. What should I change
> to get this code working with derived classes?

I created the following test case and it works:
http://pygccxml.svn.sourceforge.net/viewvc/pygccxml?view=rev&revision=1699

I tested it on Wndows, VS 2003, using pygccxml and Py++ SVN version
and boost version 1.37. I believe the same code will work on Linux
too.

Can you verify this?

> And another problem - why do I have to define TypeExposer class? Now i
> must define it because otherwise Py++ won't expose std::deque<C>. But
> IMO it should notice that F dirives from std::deque<C> so
> std::deque<C> must be exposed...

I don't see the TypeExposer definition.

-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/


More information about the Cplusplus-sig mailing list