将Python强制转换为不完整类

2024-05-01 22:03:04 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以在boostpython中只知道接口的类之间进行强制转换?你知道吗

考虑以下示例:

// ---------- 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代码中,除了它们各自的接口(这里是'A\u ifc'和'B\u ifc'),没有一个类彼此知道任何东西。所有跨模块操作只传递接口指针。 但是,当我想在Python中实现相同的行为时,这是行不通的,因为对于boostpython,每个引用的类都必须知道整个类定义。你知道吗

我已经尝试过不透明指针(请参见http://www.boost.org/doc/libs/1_55_0/libs/python/doc/v2/return_opaque_pointer.html),但是每当我编译任何包含“Boost::python::return\u value\u policy”的Boost代码时,应用程序在启动时就会因访问冲突而崩溃。 我还研究了自定义转换器(参见Boost.Python custom converter),但是我不知道如何将这个概念应用到我的问题中。你知道吗

非常感谢您的帮助


Tags: foovirtualpublicoperationclassintmoduleboost
1条回答
网友
1楼 · 发布于 2024-05-01 22:03:04

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

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

我觉得有点傻,没有尝试这么明显的解决方案早些时候。你知道吗

相关问题 更多 >