[C++-sig] Default arguments in pyplusplus

Niall Douglas s_sourceforge at nedprod.com
Wed Jun 21 03:37:59 CEST 2006


On 20 Jun 2006 at 8:49, Roman Yakovenko wrote:

> > Of course, this won't compile. Any ideas?
> 
> Obviously we need to supply different default arguments for wrapper
> and for code that
> actually exposes the function. The idea is simple we need new class variable on
> argument_t class default_value_xxx ( I explain later why xxx, but you
> will have to rename it
> to something readable ). And then to generate code that in wrapper
> uses original value, but
> in boost.python code uses modified one, right?
> 
> I attached the solution to your problem. I made small refactoring + added new
> functionality ( enum_declaration ) so you will need the latest version.

Cool, thanks for that. I've committed it to the TnFOX SVN repository.

> > Thanks for the enum idea. If I can get keyword parameters working I'd
> > be very happy.
> 
> Hope I made you very, very happy :-).

Well, nearly ...

Unfortunately, because I am now including all the patch code into 
every source file, I'm getting compiler limit: internal structure 
overflow error on some of the more complex files. So I came up with a 
cunning plan:

In file_writers/multiple_files.py create_source(), I added the 
following:

        answer = []
        if self.extmodule.license:
            answer.append( self.extmodule.license.create() )
            
        if self.extmodule.precompiled_header:
            answer.append( self.extmodule.precompiled_header.create() 
)
            
        answer.append( '#define PYPP_BUILDING_'+file_name.replace( 
'.', '_').upper() )
            
        answer.append( '#include "%s%s"' % ( file_name, 
self.HEADER_EXT ) )

        # Include all 'global' include files...

Now I have a common.h which is the precompiled header and then a 
patches.cpp.h which uses a series of #ifdef's to decide which patch 
code to include based on the macro defined above. Achieves what I 
wanted originally of inserting custom code just to where it's needed.

One other thing: I've just discovered you can't do a #pragma hdrstop 
if it's enclosed by an #if. So that code of:

        answer.append( '#ifdef _MSC_VER' )
        answer.append( self.indent( '#pragma hdrstop' ) )
        answer.append( '#endif //_MSC_VER' )

... I originally suggested is useless. Sorry about that. If you just 
plain remove it, you can specify on the command where to stop 
precompiled header inclusion.

Cheers,
Niall






More information about the Cplusplus-sig mailing list