[C++-sig] staticmethod usage

Milind Patil milind_patil at hotmail.com
Tue Apr 8 02:54:51 CEST 2003


Hi,

I have only recently started experimenting with boost.c++ package and pyste.
Congratulations
to the developers of these excellent packages.

Along the way I faced some issues. Some have been persistent and I am kinda
stumped.
Please look at the code(hello.cpp) below to illustrate some of the issues...

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python.hpp>

using namespace boost::python;

class Y {
  public:
    Y() : y(0) { }
    Y(int y) : y(y) { }
    Y(Y const& rhs) : y(rhs.y) { }
    virtual ~Y() { }

    operator int() const { return y; }

    void operator=(Y const& y) {
        this->y = y.y;
    }

    int y;
};

class X {
  public:
    X(): a(0), b(0) { }
    X(Y a, Y b) : a(a), b(b) { }
    X(Y a, Y b, void c (Y *)) : a(a), b(b) { }

    void show() {std::cout << " show " << endl; }
    static void show(const char * s) {std::cout << "static show " << s <<
endl; }
    static void tryitout (const char* s, Y y, Y z = NULL) {std::cout <<
"static tryitout " << s << endl; }
    Y a;
    Y b;
};

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_tryitout_overloads_2_3, tryitout,
2, 3)

BOOST_PYTHON_MODULE(hello)
{
    class_<Y> ("Y");

    class_<X> ("X")
        .def_readwrite("a", &X::a)
        .def_readwrite("b", &X::b)
        //.def("tryitout", (void (*)(const char *, Y, Y =
NULL ) )&X::tryitout, X_tryitout_overloads_2_3())
        .def("tryitout", (void (*)(const char *, Y, Y =
NULL ) )&X::tryitout )
        .staticmethod("tryitout")
        .def ("show", (void (X::*)() )&X::show)
        .def ("show", (void (*)(const char *) )&X::show)
        .staticmethod("show")
        ;

    implicitly_convertible<int, Y>();
    implicitly_convertible<Y, int>();
}

Essentially I have an overloaded function "show:, one of them been static.
The other staic function is
"tryitout" with optional argument. I am trying to use them thus:

import hello

x = hello.X()
y = hello.Y()

print hello.X.show("X.show")

print x.tryitout("x.tryitout", y, y)

print x.tryitout("sd", y)

print x.show()

My  issues (with boost_1_30_0, gcc 2.95 and python2.2.2):
a) If I uncomment
//.def("tryitout", (void (*)(const char *, Y, Y ) )&X::tryitout,
X_tryitout_overloads_2_3())
the compilation fails. The compiler message is long and unintelligible (to
me).

How do I use BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS with static methods?

b) If I use
.def("tryitout", (void (X::*)(const char *, Y, Y  ) )&X::tryitout )

which is what pyste generated, I get compilation problems.
The compiler cannot find the function (void (X::*)(const char *, Y,
Y ) )&X::tryitout .

Why does def("tryitout", (void (*)(const char *, Y, Y  ) )&X::tryitout )
work and not
the above?

c) The python code gives exception at
print x.show()
saying args are not right.

How do I expose overloaded functions one of which is static? Note that the
arguments to
the overloaded functions are different.

Any help is appreciated.

Thank you,
Milind







More information about the Cplusplus-sig mailing list