提升Python - 转换为不完整的类

时间:2014-06-23 15:46:12

标签: python boost

有没有办法在boost python中只知道接口的类之间进行转换?

考虑以下示例:

// ---------- Module A ----------

class A_ifc
{
public:
    virtual int foo() = 0;
};

class A_impl : public A_ifc
{
public:
    int foo() {...}
};

BOOST_PYTHON_MODULE(Module_A)
{
    class_<A_impl, boost::noncopyable>("A", no_init)
        .def("foo", &A_impl::foo)
    ;
}

// ---------- Module B ----------

class B_ifc
{
public:
    virtual int cross_module_operation(A_ifc* a) = 0;
};

class B_impl : public B_ifc
{
public:
    int cross_module_operation(A_ifc* a) {...}
};

BOOST_PYTHON_MODULE(Module_B)
{
    class_<B_impl, boost::noncopyable>("B", no_init)
        .def("cross_module_operation", &B_impl::cross_module_operation)
    ;
}

在我的C代码中,除了各自的界面(这里&#39; A_ifc&#39;和#39; B_ifc&#39;)之外,没有一个类知道彼此的任何内容。所有跨模块操作仅传递接口指针。 当我想在Python中实现相同的行为时,这不会起作用,因为对于Boost Python,必须为每个引用的类知道整个类定义。

我已经尝试过不透明的指针(参见http://www.boost.org/doc/libs/1_55_0/libs/python/doc/v2/return_opaque_pointer.html),但每当我编译任何包含&#34; boost :: python :: return_value_policy&#34;的Boost代码时,应用程序就会因访问冲突而崩溃启动。 我也查看了自定义转换器(请参阅Boost.Python custom converter),但我不知道如何将此概念应用于我的问题。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

事实证明,只要启用了运行时类型信息,就可以转换为抽象基类。

换句话说,这将起作用:objects::register_conversion<A_impl, A_ifc>();

我之前没有尝试过如此明显的解决方案,我觉得有点傻。