2011-08-31 16 views
14

मेरे पास एक en + के साथ एक सी ++ कक्षा है, और मैं इसे boost::python के साथ नकल करना चाहता था, ताकि मैं पाइथन में MyClass.value लिख सकूं। boost::python::class_ में enum_ विधि नहीं है, और मैं कामकाज की तलाश में था।क्लास-स्कोप्ड एनम

  1. मैं पहली बार की तरह

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

    lambdas के साथ करने की कोशिश की जो संकलक त्रुटि (add_property के लिए get_signature में) देता है। मुझे पता है कि मैं प्रत्येक मूल्य के लिए गेटर विधि बना सकता हूं, लेकिन यह मेरे लिए बहुत अजीब लगता है (टाइपिंग-वार)।

  2. attr का उपयोग करना:

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

    लेकिन यह उदाहरण के संदर्भ में लौटने .def और अन्य तरीकों की तरह श्रृंखलित नहीं किया जा सकता।

क्या कोई और अधिक सुरुचिपूर्ण समाधान है?

+0

'MyClass' के बाहर आपको' MyClass :: value1' जैसे enum मानों का संदर्भ देना होगा, हालांकि मैं बूस्ट-पायथन सामग्री के साथ अपने तत्व से बाहर हूं। –

+0

+1 इसे ठीक से स्वरूपित करने के लिए परेशान करने के लिए +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() 
     ; 
} 

, अपने enum मान हैं:

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

अतिरिक्त मूल्य यह है कि यदि, कहें, तो आपके enum मान सभी 'ThingyA' 'ThingyB'' ThingyC' थे, तो आप उन्हें' Thingy.A' 'Thingy.B' 'Thingy.C' के रूप में पाइथन के रूप में बेनकाब करते हैं। नामस्थान प्रदूषण और संबंधित वैश्विक नामस्थान ओजोन छेद के खिलाफ अभियान के रूप में अपमानजनक व्यक्ति के रूप में और यह सब, मैं इस सुविधा को महत्व देता हूं;) – James

+0

यह राय की बात है (जिसे मैं सहमत नहीं हूं), किसी भी मामले में सवाल पूछता है 'MyClass.value' के लिए। – eudoxos