gpt4 book ai didi

c++ - 几个具有不同签名的虚拟成员函数

转载 作者:行者123 更新时间:2023-11-30 04:21:15 25 4
gpt4 key购买 nike

我正在使用 Boost Python 为 C++ 中的某些类提供 python 接口(interface)。我发现了这种情况,我不确定如何解决:

我有一个类有这个成员函数:

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;

我对如何实现 python-boost 部分有点迷茫,我已经看到了如何处理虚函数和重载函数,但我不知道如何将两者结合起来。

顺便说一下,我在示例中看到返回 int 的虚函数(例如)应该以这种方式实现:

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

在我的例子中,它们不返回任何东西,我想我应该这样实现它们:

void f()
{
this->get_override("f")();
}

这是正确的吗?

提前致谢

最佳答案

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

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

让我们从 C++ 管道开始。您的 C++ 绑定(bind)应如下所示:

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))
;
}

我们做了什么?当代码的 Python 端调用 f(<parameters>) 时,我们将解析为正确的重载方法。然后,此方法将调用 Python 的 __f1__。 , __f2__等,其中真正用 Python 编写了方法的内容。

要完成绑定(bind),在 Python 中,您必须继承自 example.Base并实现 __f1__ , __f2__ , __f3____f4__ :

class Base(example.Base):
"""Throw here the documentation of Base - don't bother about the C++ stuff"""

def __init__(self,...):
pass

def __f1__(self):
"""Implementation of Base::f()"""
pass

def __f2__(self):
"""Implementation of Base::f(int)"""
pass

def __f3__(self):
"""Implementation of Base::f(const char*)"""
pass

def __f4__(self):
"""Implementation of Base::f(const char*, double)"""
pass

关于c++ - 几个具有不同签名的虚拟成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14624714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com