C++ Python包装层次结构避免菱形继承
我不知道用Boost.Python包装一系列类的最佳方法是什么,同时避免了混乱的继承问题。假设我有具有以下结构的类A、B和C:C++ Python包装层次结构避免菱形继承,c++,python,boost,boost-python,C++,Python,Boost,Boost Python,我不知道用Boost.Python包装一系列类的最佳方法是什么,同时避免了混乱的继承问题。假设我有具有以下结构的类A、B和C: struct A { virtual void foo(); virtual void bar(); virtual void baz(); }; struct B : public A { virtual void quux(); }; struct C : public A { virtual void foobar();
struct A {
virtual void foo();
virtual void bar();
virtual void baz();
};
struct B : public A {
virtual void quux();
};
struct C : public A {
virtual void foobar();
};
我想包装所有类A、B和C,使它们可以从Python扩展。实现这一点的常规方法是:
struct A_Wrapper : public A, boost::python::wrapper<A> {
//dispatch logic for virtual functions
};
struct B_Wrapper : public B, public A_Wrapper, public boost::python::wrapper<B> {
//dispatch logic specific for B
};
struct C_Wrapper : public C, public A_Wrapper, public boost::python::wrapper<C> {
//dispatch logic specific for C
}
struct A_Wrapper:public A,boost::python::Wrapper{
//虚拟函数的调度逻辑
};
现在,对于从A扩展而来的类B和C,我希望能够继承和共享A的包装实现。因此,我希望能够按照以下思路做一些事情:
struct A_Wrapper : public A, boost::python::wrapper<A> {
//dispatch logic for virtual functions
};
struct B_Wrapper : public B, public A_Wrapper, public boost::python::wrapper<B> {
//dispatch logic specific for B
};
struct C_Wrapper : public C, public A_Wrapper, public boost::python::wrapper<C> {
//dispatch logic specific for C
}
结构B_包装器:public B,public A_包装器,public boost::python::Wrapper{
//特定于B的调度逻辑
};
结构C_包装器:公共C,公共A_包装器,公共boost::python::包装器{
//特定于C的分派逻辑
}
然而,这似乎会带来各种各样的不好,boost包装器基的双重继承以及B_包装器和C_包装器对象中A的双重继承。有没有一种我没有的解决这个问题的通用方法
谢谢。一种方法是虚拟推导:
struct B : virtual public A, ... { };
struct C : virtual public A, ... { };
struct A_Wrapper : virtual public A, ... { };
请参阅相关的注释以及这意味着什么。我遇到了完全相同的问题,我只是没有从A_包装中继承B_包装(复制和粘贴足以满足我的需要)。 我认为可以在助手类中共享通用实现:
template<class ADERIVED>
struct A_Implem: public ADERIVED, public wrapper<ADERIVED>
{
// dispatch logic
};
模板
结构A_Implem:公共引导,公共包装
{
//调度逻辑
};
然后:
struct A_Wrapper: public A_Implem<A>
{
// ...
};
struct B_Wrapper: public A_Implem<B>
{
// ...
};
struct A\u Wrapper:public A\u Implem
{
// ...
};
结构B_包装器:公共A_Implem
{
// ...
};
感谢您的回复。如果我不一定要修改继承关系以利用虚拟继承,那该怎么办?我也想到了这个解决方案,但它不是超级吸引人的,而且过于侵入。当然,这是一个相当常见的操作,即包装一个类型层次结构,其中层次结构中的多个非叶点可以通过Python进行扩展,但我找不到任何关于它的讨论。是的,这实际上是我目前的解决方案。这是可行的,但在我看来相当笨拙。我希望我错过了什么。但这可能是唯一的非侵入性选项。只有当A、B和C都使用相同数量的构造函数参数时,这似乎才起作用,因为A_Implem知道如何调用ADERIVED的构造函数。还是我遗漏了什么?