このエラー メッセージが表示されたときは、少し驚きました。
TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'
私がやろうとしているのは、__lshift__
オペランドをオーバーロードして int、float、char* などのいくつかの異なるオブジェクト型を取るブースト python を介してクラスを公開することです。クラスを正しく公開していますが、次のようなものを試してみるpacket << 10
と前述のエラー。
これがなぜなのかは理解していますが、これをどのように解決すればよいのか正確にはわかりません。packet << 10
とを区別できなかったため、boost::python::object でオーバーロードを正確に行うことはできませんpacket << 10.5
。
考えられる解決策の 1 つは、関数を .xml 以外のものとして公開すること__lshift__
です。最終的にpacket.saveInt(10)
andになる可能性があり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)
。これは一種のハックであり、より良い方法があることを願っています。
助言がありますか?ありがとう!