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

时间:2012-06-16 07:00:34

标签: c++ boost-python

当我收到此错误消息时,我有点意外。

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

我想要做的是通过boost python公开一个类,它重载__lshift__操作数以获取几种不同的对象类型 - 例如int,float,char *等。我正在暴露类但是当我尝试像packet << 10这样的事情时,我得到了上述错误。

我理解为什么会这样,但我不确定应该如何解决这个问题。我无法使用boost :: python :: 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)。这有点像hackish,我希望有更好的方法。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

我尽力保持语法糖,但最终将不同的运算符&lt;&lt;(&lt;()和operator&gt;&gt;()方法暴露为saveInt32(value),saveString(value),loadInt32(), loadString()等等。