当我收到此错误消息时,我有些惊讶。
TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'
我正在尝试做的是通过boost python公开一个类,该类重载__lshift__
操作数以采用几种不同的对象类型——例如int、float、char *等。我正确地公开了这个类,但是当我尝试类似packet << 10
我得到的东西时上述错误。
我明白为什么会这样,但我不确定我应该如何解决这个问题。我不能完全有一个 boost::python::object 的重载,因为它无法区分packet << 10
and 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)
的。这有点骇人听闻,我希望有更好的方法。
有什么建议么?谢谢!