1

NULL値の概念を持つBoost.PythonでラップされたC++値型があります。ラッパーコードの関連部分は次のように表示されます。

class_<TCurrency> currency( "TCurrency" )
    .def( init<long>() )
    .def( init<const std::string&>() )
    <...>;

None現在、メソッドに渡してPythonでNULLインスタンスを作成しようとすると__init__()、const文字列参照を受け入れるC++ctorが無効な参照で呼び出されます。(&arg == NULL

コンストラクターに渡されているケースをトラップしNoneて適切に処理することはできますか、または少なくともプログラムがクラッシュする前に意味のある例外をスローすることはできますか?

Boost1.36とPython2.6.2を使用します。

4

1 に答える 1

2

Noneが使用されている場合、オーバーロードを追加するinit<void*>とNULLが渡されますが、これがコーナーケースで他のctorにどのように影響するかはわかりません。また、省略した場合、あなたが言及したのと同じNoneからstring const&変換を取得しませんinit<void*>。Boost.Python1.37およびPython2.6.2の使用。

例:

#include <iostream>
#include <string>

#include <boost/python.hpp>


struct A {
#define BODY { std::cout << __PRETTY_FUNCTION__ << '\n'; }
    A() BODY
    A(long) BODY
    A(std::string const&) BODY
    A(void* p) BODY
#undef BODY
};

BOOST_PYTHON_MODULE(ex) {
using namespace boost::python;
class_<A>("A")
    .def(init<long>())
    .def(init<std::string const&>())
    .def(init<void*>())
;
}
>>>インポート例
>>> ex.A()
A :: A()
<例:0x839bf7cのオブジェクト>
>>>例A(42)
A :: A(long int)
<例:0x839bfccのオブジェクト>
>>> ex.A( "abc")
A :: A(const std :: string&)
<例:0x839bf7cのオブジェクト>
>>>例A(なし)
A :: A(void *)
<例:0x839bfccのオブジェクト>

省略されている場合init<void*>

>>>例A(なし)
トレースバック(最後の最後の呼び出し):
  <module>のファイル"<stdin>"、1行目
Boost.Python.ArgumentError:Python引数タイプ
    A .__ init __(A、NoneType)
C ++署名と一致しませんでした:
    __init __(_ object *、std :: string)
    __init __(_ object *、long)
    __init __(_ object *)
于 2009-12-02T06:21:09.953 に答える