2011-08-31 17 views
14

içimde bir enum olan bir C++ sınıf var ve ben Python MyClass.value yazabilir, böylece o boost::python ile taklit eden istedi. boost::python::class_ bir enum_ yöntemi yoktur ve ben geçici çözümler arıyordu.Sınıf-kapsamlı enum

  1. İlk (add_property için get_signature olarak) derleyici hata verir

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

    gibi lambda çalışmıştır. Ben değerlerin her biri için alıcı yöntemi oluşturabilirsiniz biliyorum, ama bu (yazarak-bilge) bana çok garip görünüyor.

  2. attr kullanılması

    :

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

    ancak örneğine referans geri .def ve diğer yöntemler gibi zincirli edilemez.

Daha şık bir çözüm var mı?

+0

dışında 'ben boost-piton şeylerle zaman unsuru olsam da,' Sınıfım :: değer1 gibi enum değerleri referans gerekir MyClass'. Düzgün biçimlendirmek için rahatsız etmek için –

+0

+1. –

cevap

11

Bir kapsamı kullanarak bunu yapabilirsiniz: python Sonra

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

, enum değerler şunlardır:

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 

(benim ipython kabuğundan, bu ve tüm test;)

arasında
+0

enum ne istiyorum olmadığı, yuvalanmış; Bazı katma değer olmadan '.MyEnum' yazmak için iğrenç ve daha az okunabilir. – eudoxos

+3

katma değer demek, eğer, enum değerler olduğunu tüm 'ThingyA'' ThingyB' 'ThingyC', o zaman' Thingy.A' 'Thingy.B'' Thingy.C' olarak piton onları maruz. Ad alanı kirliliği ve ilgili küresel isim alanı ozon deliği ve tüm bu karşı kampanyaları yapan iğrenç bir kişi olarak, bu özelliğe değer veriyorum;) – James

+0

Bu bir fikir meselesi (ki buna katılmıyorum), her durumda soru sorar MyClass.value' için. – eudoxos