Boost Python导出单例模式

3

我有一个单例(来自boost::serialization):

class LogManager : public boost::serialization::singleton<LogManager> { ... };

获取实例的包装器:

inline LogManager &logManager() { return LogManager::get_mutable_instance(); }

如何将此绑定到boost.python模块中?

我尝试了以下方法:

class_< LogManager, boost::serialization::singleton<LogManager> >("LogManager", no_init)
    ...
;

因此,在控制台中出现了很多丑陋的错误文本。出了什么问题?

就是这样:http://dpaste.com/499848/ - Max Frai
为什么将 boost::serialization::singleton<LogManager> 作为第二个模板参数传递? - James
@autopulated,LogManager所继承的是父对象。 - Max Frai
2个回答

4

除了像Autopulated指出的那样在第二个参数中使用bases<...>外,我认为您还想将boost::noncopyable指定为第三个模板参数,例如:

bp::class_<LogManager, bp::bases<boost::serialization::singleton<LogManager> >, boost::noncopyable>("LogManager", bp::no_init)

编辑: 此外,您需要为所有列出的基类提供一个类声明,例如:

bp::class_<boost::serialization::singleton<LogManager>, boost::noncopyable>("Singleton", bp::no_init)

或者,如果您不需要访问基类并且不会导出boost::serialization::singleton<LogManager>的任何其他子类,则可以省略在第一次指定基类。也就是说,如果您只想公开LogManager类,则以下声明就足够了:

bp::class_<LogManager, boost::noncopyable>("LogManager", bp::no_init)

哼,现在它编译通过了。但是第三个参数具体是做什么的? - Max Frai
但是当我导入模块时,出现了以下错误:RuntimeError: extension class wrapper for base class boost::serialization::singleton<LogManager> has not been created yet - Max Frai
据我理解,它告诉boost::python不要为返回包装类实例的函数制作转换器。 - Ray

1

您需要将bp::bases< boost::serialization::singleton<LogManager> >作为第二个模板参数。


ps: bp::class_< LogManager, bp::bases< boost::serialization::singleton<LogManager> > >("LogManager", bp::no_init) - Max Frai
啊,是的;好的,请看 Ray 的回答 :) 这些错误是因为它试图将其公开为可复制构造的,而您希望它不可复制。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接