[C++-sig] bp::arg() also requires types to be declared
Niall Douglas
s_sourceforge at nedprod.com
Wed Jun 21 18:01:22 CEST 2006
On 21 Jun 2006 at 8:06, Roman Yakovenko wrote:
> > We have a problem therefore. I can only see one should set
> > use_keywords to False on every calldef taking a typed default
> > parameter. Unfortunately, this is most of them and thus renders using
> > bp::arg() useless.
> >
> > Ideas? How hard would it be to patch BPL to let this work usefully?
>
> Niall, I have an idea, but unfortunately I don't have time to check
> it. Please take a
> look on pyplusplus/module_creator/class_organizer.py file. This file contains
> algorithm - classic topological sort. It is used to define the order of exported
> classes. I am sure you can improve it, so we will not have this problem.
Herein lies a problem:
class Foo;
class Foo2
{
friend class Foo;
Foo2(Foo *f=0);
};
class Foo
{
Foo(Foo2 *f=0);
inline void somemethod(Foo2 *a) { a->foo(); }
};
Here you need to declare Foo and Foo2 to BPL. Problem is, they take
constructor args circularly so if I try to declare default args,
either one or the other is going to be undeclared to BPL and you get
the fault.
If, and only if, both Foo and Foo2 have constructors with no default
args, you can delay the constructor declaration and declare it later
via bp::init<>. Otherwise you are trapped and can't use bp::arg() at
all.
To fix pyplusplus to correctly order stuff according to all these
possibilities, and even then still leaving open the potential of it
failing to work in certain rare circumstances - well, the correct
thing to do IMHO is to alter the implementation of bp::arg() so it
doesn't need to have the type declared to BPL via bp::class_() first.
All this said, I am now out of time for the python bindings. I am
going to have to cease development once again for the next few
months. Sorry, I get windows and these windows get exhausted. I must
now begin on a new chaotic economic modelling software I want to base
my PhD on.
Cheers,
Niall
More information about the Cplusplus-sig
mailing list