2011-08-31 71 views
14

我有一個C++類裏面有一個枚舉,我想用boost::python來模仿,以便我可以在python中編寫MyClass.valueboost::python::class_沒有enum_方法,我正在尋找解決方法。類範圍的枚舉

  1. 予先用lambda表達式試圖像

    MyClass{ 
        enum{value1,value2}; 
    }; 
    
    class_<MyClass>("MyClass").add_property("value1",&[](){return value1;}).staticmethod("value1"); 
    

    這給編譯器錯誤(在get_signatureadd_property)。我知道我可以爲每個值創建getter方法,但對我來說這似乎非常尷尬(鍵入方式)。

  2. 使用attr

    auto classObj=class_<MyClass>("MyClass"); 
    classObj.attr("value1")=(int)value1; 
    classObj.attr("value2")=(int)value2; 
    

    ,但它不能被捆綁,像.def等方法返回的參考實例。

有沒有更優雅的解決方案?

+0

「MyClass」之外,您需要引用像MyClass :: value1這樣的枚舉值,儘管我用boost-python的東西超出了我的元素範圍。 –

+0

+1用於擾亂格式正確。 –

回答

11

您可以使用範圍做到這一點:在Python

#include <boost/python/module.hpp> 
#include <boost/python/class.hpp> 
#include <boost/python/scope.hpp> 
#include <boost/python/enum.hpp> 

namespace bp = boost::python; 

class MyClass{ 
    public: 
     enum MyEnum {value1,value2}; 
}; 

BOOST_PYTHON_MODULE(nestedtest){ 

    bp::scope the_scope 
     = bp::class_<MyClass>("MyClass") 
     ; 

    bp::enum_<MyClass::MyEnum>("MyEnum") 
     .value("value1", MyClass::value1) 
     .value("value2", MyClass::value2) 
     .export_values() 
     ; 
} 

然後,你的枚舉值是:

In [8]: nestedtest.MyClass.MyEnum.values 
Out[8]: {0: nestedtest.MyEnum.value1, 1: nestedtest.MyEnum.value2} 

In [9]: nestedtest.MyClass.MyEnum.value1 
Out[9]: nestedtest.MyEnum.value1 

In [10]: nestedtest.MyClass.MyEnum.value2 
Out[10]: nestedtest.MyEnum.value2 

(從我的IPython Shell,我測試了這一點,所有的;)

+0

枚舉是嵌套的,這不是我想要的;如果輸入'.MyEnum'沒有一些附加值,它會令人討厭並且不易讀。 – eudoxos

+3

附加值是,如果你的枚舉值都是'ThingyA''ThingyB''ThingyC',那麼你將它們暴露給python作爲'Thingy.A''Thingy.B''Thingy.C'。作爲一種反對命名空間污染和臭名昭着的全球命名空間臭氧空洞的討厭人物,我很看重這個功能;) – James

+0

這是一個意見問題(我不同意),無論如何這個問題要求爲'MyClass.value'。 – eudoxos