我想以正确的方式做到这一点。我在这里看到过暴露boost :: serialization :: singleton Boost python export singleton但我不想使用它。我想用简单的meyers单身代替。
以下代码有效,但文档说使用http://www.boost.org/doc/libs/1_43_0/libs/python/doc/v2/reference_existing_object.html#reference_existing_object-spec/是危险的。
代码:
class Singleton
{
private:
Singleton(){};
public:
static Singleton & getInstance()
{
static Singleton instance;
return instance;
}
int getNumber() { return 5; }
};
在模块中:
class_<Singleton>("singleton", no_init)
.def("getInstance", &Singleton::getInstance, return_value_policy<reference_existing_object>()).staticmethod("getInstance")
.def("getNumber", &Singleton::getNumber)
;
有什么好办法吗?在执行python代码时使用return_internal_reference<>()
导致错误。
答案 0 :(得分:3)
我们的代码中有很多这样的东西,我没有想过一个简单的方法,但我们通过返回boost :: shared_ptr&lt;&gt;来公开它们。从带有空删除器的引用(我们以某种方式将部分代码移动到shared_ptr而其他部分没有移动,因此这是混合)。这不是最好的事情,但它可以按预期工作并且没有pitfals,如果你确保在主要部分离开后不对指针做任何事情。
对象的生命周期将使解释器过载,因此在将任何引用传递回python时,您不必担心任何问题。该库只有在解释器退出后才会释放(可能是在调用或不调用析构函数时,如果出现错误,有时可能会出现整体错误。)。因此,在这种情况下,您可以将解释器视为经典的main()函数。
class_<XY, shared_ptr<XY>, boost::noncopyable >("XY",no_init)
.def("getInstance",&XY::getSharedInstance )
.staticmethod("getInstance")
struct NullDeleter
{
void operator()(const void*){}
};
XY& XY::getInstance()
{
static XY in;
return in;
}
// This can also be written as a standalone function and added to the python class above.
shared_ptr<XY> XY::getSharedInstance()
{
return shared_ptr<XY>( &getInstance(), NullDeleter() );
}
或者您可以将sharedInstance非侵入式写入单独的函数并在python包中使用它:
shared_ptr<XY> getSharedInstance()
{
return shared_ptr<XY>( &XY::getInstance(), NullDeleter() );
}
class_<XY, shared_ptr<XY>, boost::noncopyable >("XY",no_init)
.def("getInstance",&getSharedInstance )
.staticmethod("getInstance")