2015-06-23 14 views
5

Tôi đang cố gắng bọc một lớp enum trong một tập tin tiêu đề C++ để sử dụng trong một dự án cython. Tôi đã googled xung quanh và không thể tìm hiểu làm thế nào để đạt được điều này - nó được hỗ trợ?Quấn lớp enum cho cython

+1

Bạn có thể giải thích bằng ví dụ có 'cdef enum Foo: [...]' không trả lời nhu cầu của bạn không? – coincoin

+1

Tôi không bao gồm một enum c, nhưng một lớp C++ enum vì vậy điều này không làm việc – user3684792

+0

Làm enum như là một 'ctypedef' và nội dung của enum trong một không gian tên? (Tôi đã không thử nghiệm này, nhưng có vẻ như nó có thể làm việc) – DavidW

Trả lời

6

lớp CPP

enum class Color {red, green = 20, blue}; 

Định nghĩa kiểu

cdef extern from "colors.h": 
    cdef cppclass Color: 
    pass 

Định nghĩa của các loại màu

cdef extern from "colors.h" namespace "Color": 
    cdef Color red 
    cdef Color green 
    cdef Color blue 

Python thực hiện

cdef class PyColor: 
    cdef Color thisobj 
    def __cinit__(self, int val): 
    self.thisobj = <Color> val 

    def get_color_type(self): 
    cdef c = {<int>red : "red", <int> green : "green", <int> blue : "blue"} 
    return c[<int>self.thisobj] 
0

Đây là giải pháp thay thế sử dụng khả năng thay đổi tên của mã nhận dạng cython và C++.

header.hpp

namespace foo { 
enum class Bar : uint32_t { 
    BAZ, 
    QUUX 
}; 
} 

header.pxd

cdef extern from "header.hpp" namespace "foo::Bar": 
    cdef enum Bar "foo::Bar": 
     BAZ, 
     QUUX 

main.pyx

from header cimport * 
cdef void doit(Bar b): 
    pass 

doit(BAZ) # Not Bar.BAZ, which would have been nicer. 

Đó là một cách hiệu quả tellin g cython rằng có tồn tại một không gian tên gọi là "foo :: Bar", và đặt một enum kiểu C trong đó. Để chống lại một thực tế là Bar nếu không sẽ trở thành "foo :: Bar :: Bar" mà cũng được đưa ra một tên ghi đè. Nó có nghĩa là Bar :: BAZ được gọi là BAZ trong cython, chứ không phải Bar.BAZ mà sẽ là một đại diện idiomatic hơn của các lớp enum, nhưng nó có vẻ gần đủ.

Các vấn đề liên quan