[C++-sig] wrapping a Singleton class
Faheem Mitha
faheem at email.unc.edu
Sun Jun 12 03:04:40 CEST 2005
Hi,
Consider the following Singleton class, which seems to have problems
being wrapped by Boost.Python.
********************************************************
class lustate
{
public:
static lustate& instance(const vector<double>& lower,
const vector<double>& upper)
{
static lustate lu(lower, upper);
return lu;
};
vector<double> l;
vector<double> u;
private:
lustate(const vector<double>& _l, const vector<double>& _u):
l(_l), u(_u) {};
};
****************************************************************
I tried
BOOST_PYTHON_MODULE(mg)
{
boost::python::class_<lustate>("lustate", boost::python::no_init)
// boost::python::class_<lustate>("lustate")
.staticmethod("instance")
;
}
This compiles without error, but on importing I get
*******************************************************************************
In [1]:import mg
---------------------------------------------------------------------------
exceptions.KeyError Traceback (most recent call last)
/home/faheem/co/paper/mg/c++/<console>
KeyError: 'instance'
********************************************************************************
I think that static member functions still require the corresponding
class to be instantiated in Python, since it is invoked like a regular
bound method, though the values obtained are of course the same for
every instantiation. This understanding is based on Googling + the
example files staticmethod.cpp & staticmethod.py.
In other words, it doesn't have the equivalent of
lustate::instance
at the Python level. Since the constructor is private, it cannot
instantiate the class. Hence, it is stuck.
Is this an accurate description of the situation? I'm not sure what
the error means, though.
Faheem.
More information about the Cplusplus-sig
mailing list