1

このエラー メッセージが表示されたときは、少し驚きました。

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)。これは一種のハックであり、より良い方法があることを願っています。

助言がありますか?ありがとう!

4

1 に答える 1

0

さらに調査した結果、int を参照渡ししようとしていて、Python がそれをサポートしていないことが問題であることがわかりました。

私は構文糖衣を維持するために最善を尽くしましたが、最終的には異なる演算子 <<() および演算子 >>() メソッドを saveInt32(value)、saveString(value)、loadInt32()、loadString() などとして公開することになりました。

于 2012-07-17T23:59:02.817 に答える