[C++-sig] Overloads.html

William Trenker wtrenker at hotmail.com
Mon Dec 16 21:43:06 CET 2002

What follows is my attempt to summarize the help I've received here on the 
subject of overloads.  Have I explained this appropriately?




This is a variant of the example in overloads.html.  This example 
  - overloading a member function


#include <boost/python.hpp>
using namespace boost::python;

struct Y
    int f() { return 123; };
struct X
    Y& f(int x, double y = 4.25, char const* z = "wow")
        return inner;
    int f(int a, int b, int c) { return a + b + c; };
    Y inner;

    int (Y::*fy)() = &Y::f;
        .def("f", fy)

    Y& (X::*fx1)(int,double,char const*) = &X::f;
    int (X::*fx2)(int, int, int) = &X::f;
    class_<X>("X", "This is X's docstring")
        .def("f", fx1, "f's docstring",
                args("x", "y", "z"),
        .def("f", fx2, args("a","b","c"))


Notice that .def("f",fx2 ...) doesn't have a docstring.  Since Python can't 
overload functions or class members, only one specification of docstring can 
be used.  However, notice that each .def() for class_<X> does have different 
values for arg() which can be used in Python for keyword arguments.

The return_internal_reference<>() is essential because the .def() it is part 
of represents a function that returns a reference (i.e. Y&).

Pythonistas will find the idea of overloaded functions based on argument 
signatures a strange notion, but the above wrapper code actually makes the 
following possible:

import args_ext

y = args_ext.Y()
print 'y.f() = %i' % y.f()

x = args_ext.X()
print 'x.f(5,4,3) = %i' % x.f(5,4,3)
print 'x.f(b=1,a=2,c=3) = %i' % x.f(b=1,a=2,c=3)

y = x.f(2,3.0,"hi")
print 'type(y) = %s' % type(y)
print 'y.f() = %i' % y.f()

y.f() = 123
x.f(5,4,3) = 12
x.f(b=1,a=2,c=3) = 6
type(y) = <class 'args_ext.Y'>
y.f() = 123


MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*. 

More information about the Cplusplus-sig mailing list