使用重载函数将 Python 'int'提升为 C++ int

Boost Python 'int' to C++ int with overloaded function

本文关键字:int C++ 重载 Python 函数      更新时间:2023-10-16

当我收到此错误消息时,我有些惊讶。

TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'

我试图做的是通过 boost python 公开一个类,该类重载__lshift__操作数以采用几种不同的对象类型 - 例如 int、float、char* 等。我正确地公开了类,但是当我尝试类似packet << 10时,我遇到了上述错误。

明白为什么会这样,但我不确定我应该如何解决这个问题。我不能完全使用 boost::p ython::object 进行重载,因为那样它就无法区分packet << 10packet << 10.5

一种可能的解决方案是将函数公开为__lshift__以外的其他功能。然后我可能会得到packet.saveInt(10)packet.saveFloat(10.5),但这破坏了我们都非常钦佩的python语法糖。

我的另一个想法是,我可以围绕内置的int类型创建一个非常薄的类并将其纳入其中。

struct Int32 {
    Int32(bp::object obj) {
        if (PyInt_Check(obj.get()) {
            value = bp::extract<int>(obj);
        }
        PyErr_SetObject(PyExc_ValueError, obj);
        bp::throw_error_already_set();
    }
    int value;
}
BOOST_PYTHON_MODULE(intwrapper)
{
        bp::class_<Int32>("Int32", bp::init<bp::object>)
            .def("value", &Int32::value);
}

有了这个,我可以执行以下操作。 packet << Int32(10)和类似的packet << Float(10.5).这有点黑客,我希望有更好的方法。

有什么建议吗?谢谢!

经过更多的调查,我发现问题是我试图通过引用传递一个int,而Python不支持这一点。

我尽力保留语法糖,但最终公开了不同的运算符 <<() 和运算符>>() 方法,如 saveInt32(value)、saveString(value)、loadInt32()、loadString() 等。