1

変更できないC++のクラスがあります。ただし、そのクラスには、Python拡張機能でアクセスできるようにする必要があるアイテムのstd ::list<>が含まれています。Boost ::Pythonにはstd::listとPythonリストの間に組み込みの変換がないように見えるので、この変換を実行できるメソッドをC++で記述できることを望んでいました。 C ++クラスをPythonクラスにマッピングしているので、このメソッドをアタッチできます。

次のようなメソッドを呼び出すことができればいいのですが

baseClassInstance.get_std_list_of_items_as_python_list()
4

2 に答える 2

3

より一般的な方法で質問に答えるために、class_宣言のpythonエクスポートに正しい署名を持つ任意のc++関数をアタッチできます。

クラスfooを想定します。

struct foo
{
    //class stuff here
}

fooへの参照を最初の引数として取るfree関数を定義できます。

int do_things_to_a_foo(foo& self, int a, std::string b, other_type c)
{
    //Do things to self
}

そして、fooのメンバーのようにエクスポートします。

class_<foo>("foo")
   ...
   .def("do_things_to_a_foo", &do_things_to_a_foo)
   ...
   ;
于 2010-11-10T17:17:27.103 に答える
1

Boostは、イテレータをラップするためのヘルパーを提供します。これについては、http ://www.boost.org/doc/libs/1_42_0/libs/python/doc/v2/iterator.htmlに記載されています。

この例では、そのページの終わりが私のために機能したと聞いています。たとえば、変換を明示的に作成する必要があります。

  class_<std::list<Item> >("ItemList")
    .def("__iter__", iterator<std::list<Item> >());

C ++クラスを変更せずに変更するために、私は実際のクラスをサブクラス化する薄いラッパーを作成する習慣があります。これは、C++オブジェクトをPythonから快適に感じさせるすべてのクラッドを分離するのに最適な場所になります。

  class Py_BaseClass : public BaseClass {
  public:
    std::list<Item> & py_get_items();
  }
于 2010-03-04T02:28:56.870 に答える