Boost Python 导出单例

3 投票
2 回答
1609 浏览
提问于 2025-04-16 13:39

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

结果是控制台里出现了一堆难看的错误信息。到底出什么问题了?

2 个回答

1

你想要把 bp::bases< boost::serialization::singleton<LogManager> > 作为第二个模板参数来使用。

4

除了在第二个参数中使用 bases<...>,正如Autopulated提到的,我觉得你还需要在第三个模板参数中指定 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)

撰写回答