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

要以更一般的方式回答这个问题,您可以将任何具有正确签名的 c++ 函数附加到 class_ 声明中的 python 导出。

假设一个类 foo:

struct foo
{
    //class stuff here
}

您可以定义一个自由函数,它将对 foo 的引用作为第一个参数:

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 回答