2011-08-31 25 views
14

Tôi có một lớp C++ với một enum bên trong, và tôi muốn bắt chước với boost::python, để tôi có thể viết MyClass.value trong python. boost::python::class_ không có phương thức enum_ và tôi đang tìm cách giải quyết.Class-scoped enum

  1. đầu tiên tôi thử với lambdas như

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

    mang đến cho lỗi biên dịch (trong get_signature cho add_property). Tôi biết tôi có thể tạo ra phương pháp getter cho mỗi giá trị, nhưng điều đó có vẻ rất khó xử với tôi (đánh máy khôn ngoan).

  2. Sử dụng attr:

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

    nhưng nó không thể bị xiềng xích như .def và các phương pháp trở về tham chiếu đến các ví dụ.

Có giải pháp thanh lịch hơn không?

+0

Bên ngoài 'MyClass', bạn sẽ cần phải tham chiếu các giá trị enum như' MyClass :: value1', mặc dù tôi không nằm trong phần tử của tôi với công cụ tăng cường python. –

+0

+1 vì làm phiền định dạng này đúng cách. –

Trả lời

11

Bạn có thể làm điều đó bằng cách sử dụng phạm vi:

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

Sau đó, trong trăn, các giá trị enum của bạn là:

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 

(từ vỏ ipython của tôi, tôi đã thử nghiệm này và tất cả;)

+0

Enum được lồng nhau, đó không phải là những gì tôi muốn; nó là đáng ghét và ít có thể đọc được để gõ '.MyEnum' mà không có một số giá trị gia tăng. – eudoxos

+3

Giá trị gia tăng là nếu, giả sử, giá trị enum của bạn là tất cả 'ThingyA'' ThingyB' 'ThingyC', thì bạn đưa chúng vào python là' Thingy.A' 'Thingy.B'' Thingy.C'. Là loại người đáng ghét chống lại không gian tên miền và lỗ hổng không gian tên miền toàn cầu liên quan và tất cả điều đó, tôi coi trọng tính năng này;) – James

+0

Đó là vấn đề của ý kiến ​​(mà tôi không đồng ý), trong mọi trường hợp câu hỏi hỏi cho 'MyClass.value'. – eudoxos