2011-08-31 16 views
14

私は列挙型のC++クラスを持っています。boost::pythonでそれを模倣したいので、MyClass.valueをPythonで書くことができます。 boost::python::class_にはenum_メソッドがありません。回避策を探していました。クラススコープenum

  1. Iは、第一(add_propertyget_signatureで)コンパイルエラーを与える

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

    等ラムダと試みました。私はそれぞれの値に対してゲッターメソッドを作成できることは知っていますが、それは私にとって非常に扱いにくい(タイピング賢い)ようです。

  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

#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() 
     ; 
} 

次に、Pythonで、あなたの列挙型の値は次のとおりです。

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シェルから、私はこれとすべてのテスト;)

+0

enumはネストされています。これは私が望むものではありません。いくつかの付加価値なしで '.MyEnum'と打ち込むのは不快で読みにくいものです。 – eudoxos

+3

付加価値は、例えば、あなたの列挙型の値が全て 'ThingyA'' ThingyB'' ThingyC'ならば、それらを 'Thingy.A'' Thingy.B'' Thingy.C'としてPythonに公開します。名前空間の汚染とそれに関連するグローバルな名前空間のオゾンホールとそれに関連するキャンペーンの悪意のある人物の一種として、私はこの特徴を評価しています; – James

+0

これは意見の問題です(私は同意しません)。 MyClass.valueのために。 – eudoxos