1

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

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

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

我明白为什么会这样,但我不确定我应该如何解决这个问题。我不能完全有一个 boost::python::object 的重载,因为它无法区分packet << 10and packet << 10.5

一种可能的解决方案是将函数公开为__lshift__. 然后我可以得到packet.saveInt(10)andpacket.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)的。这有点骇人听闻,我希望有更好的方法。

有什么建议么?谢谢!

4

1 回答 1

0

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

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

于 2012-07-17T23:59:02.817 回答