2010-02-27 16 views
1

我有一個C++類,我不能修改。但是,該類包含我需要能夠在Python擴展中訪問的項目的std :: list <>。由於Boost :: Python在std :: list和Python列表之間似乎沒有內置的轉換,所以我希望能夠用C++編寫一個可以爲我和後來做轉換的方法,當我將C++類映射到Python類,我可以附加此方法。如何在不修改基類的情況下使用Boost :: Python將方法添加到導出的類中?

我寧願如果我可以調用諸如

baseClassInstance.get_std_list_of_items_as_python_list() 

回答

1

升壓方法提供了一個輔助包裝迭代器這是記錄在這裏: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(); 
    } 
3

要回答這個問題在更廣泛的方式,你可以將一個具有正確的簽名在class_聲明蟒蛇出口任何C++函數。

假設類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 
} 

和出口它就像富的成員:

class_<foo>("foo") 
    ... 
    .def("do_things_to_a_foo", &do_things_to_a_foo) 
    ... 
    ; 
相關問題