【问题标题】:Boost python export singleton提升python导出单例
【发布时间】:2011-03-14 13:27:04
【问题描述】:

我有一个单例(来自 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)
    ...
;

因此 - 控制台中有很多丑陋的错误文本。怎么了?

【问题讨论】:

  • 就是这样:dpaste.com/499848
  • 为什么将boost::serialization::singleton&lt;LogManager&gt; 作为第二个模板参数传递?
  • @autopulated 是继承自 LogManager 的父对象。

标签: c++ python boost singleton


【解决方案1】:

除了像 Autopulated 指出的那样在第二个参数中使用 bases&lt;...&gt; 之外,我认为您还想指定 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&lt;LogManager&gt; 的任何其他子类,那么您可以省略首先指定基类。也就是说,如果您只想公开 LogManager 类,则以下声明就可以了:

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

【讨论】:

  • 嗯,现在可以编译了。但是 3d 参数有什么作用呢?
  • 但是当我导入模块时,我得到:RuntimeError: extension class wrapper for base class boost::serialization::singleton&lt;LogManager&gt; has not been created yet
  • 据我了解,它告诉 boost::python 不要为将按值返回包装类实例的函数制作转换器。
【解决方案2】:

您希望将bp::bases&lt; boost::serialization::singleton&lt;LogManager&gt; &gt; 作为第二个模板参数。

【讨论】:

  • ps:bp::class_&lt; LogManager, bp::bases&lt; boost::serialization::singleton&lt;LogManager&gt; &gt; &gt;("LogManager", bp::no_init)
  • 啊,是的;好吧,请参阅 Ray 的回答 :) 这些错误是因为它试图将其公开为可复制构造,而您希望它不可复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多