几个具有不同签名的虚拟成员函数 我使用Boost Python为C++中的一些类提供Python接口。 我发现这种情况,我不知道如何解决:

几个具有不同签名的虚拟成员函数 我使用Boost Python为C++中的一些类提供Python接口。 我发现这种情况,我不知道如何解决:,c++,python,boost,boost-python,C++,Python,Boost,Boost Python,我有一个类具有以下成员函数: virtual void visit(const ReportClass r) = 0; virtual void visit(const unsigned int category) = 0; virtual void visit(const char* type) = 0; virtual void visit(const char* name, const unsigned int id, const char &value ) = 0; virtua

我有一个类具有以下成员函数:

virtual void visit(const ReportClass r) = 0;
virtual void visit(const unsigned int category) = 0;
virtual void visit(const char* type) = 0;
virtual void visit(const char* name, const unsigned int id, const char &value ) = 0;
virtual void visit(const char* name, const unsigned int id, const unsigned short &value ) = 0;
virtual void visit(const char* name, const unsigned int id, const unsigned int &value ) = 0;
virtual void visit(const char* name, const unsigned int id, const MaskedAddr &value ) = 0;
virtual void visit(const char* name, const unsigned int id, const unsigned long long &value ) = 0;
我对如何实现PythonBoost部分有点迷茫,我看到了如何处理虚拟函数和重载函数,但我不知道如何将两者结合起来

顺便说一句,我在示例中看到,返回int(例如)的虚拟函数应该这样实现:

int f()
{
    return this->get_override("f")();
}
void f()
{
     this->get_override("f")();
}
在我的情况下,它们不会返回任何内容,我想我应该这样实现它们:

int f()
{
    return this->get_override("f")();
}
void f()
{
     this->get_override("f")();
}
这是正确的吗


提前感谢

让我们先回答一个简单的问题:即使返回类型为void,也可以始终“返回此->获取覆盖(“f”)()”。实际上,在这样的包装器代码中,我发现甚至是更好的选择,因为如果包装的函数突然返回一些东西,您将得到一个编译错误


现在的难题是:如何在这里混合虚拟函数和重载函数。我将使用模板方法模式来避免这个问题。其思想是简单地提供一个调用私有虚拟函数的公共非虚拟函数。(可选)您可以使虚拟机受到保护,以便允许扩展而不是重写。此外,在非虚拟方法中,您可以验证派生类必须满足的前置/后置条件或验证参数(例如assert(name);)。

如果我正确理解您的问题,您需要将纯虚拟(重载)方法绑定到Python,以便可以从Python重载它们。你的教程部分解释了这一点。在您的特定情况下,C++和Python与重载不很好地交互。虽然C++允许,但Python禁止。在Python中,不能有两个名为
f
的方法。我们需要做的是将python调用分开,这样用户就可以实现python的重写

我会写一个小的例子,但你可以从中抽象出来

让我们从C++管道开始。您的C++绑定应该是这样的:

struct BaseWrap : Base, boost::python::wrapper<Base> {
    int f() {
        return this->get_override("__f1__")();
    }

    int f(int i) {
        return this->get_override("__f2__")()
    }

    int f(const char* s) {
        return this->get_override("__f3__")()
    }

    int f(const char* s, double d) {
        return this->get_override("__f4__")()
    }
};

//your module code will look like this
BOOST_PYTHON_MODULE(example) {
  using namespace boost::python;
  class_<BaseWrap, boost::noncopyable>("Base")
    .def("f", pure_virtual(((int)(Base::*)())&Base::f))
    .def("f", pure_virtual(((int)(Base::*)(int))&Base::f))
    .def("f", pure_virtual(((int)(Base::*)(const char*))&Base::f))
    .def("f", pure_virtual(((int)(Base::*)(const char*, double))&Base::f))
  ;
}
过度充电功能?那是什么?