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
5
A
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
- 1. các lớp cython rất chậm?
- 2. typedef và enum hoặc enum lớp
- 3. Mẫu cho loại an toàn C++ 11 cờ enum lớp
- 4. Làm cách nào để bọc một lớp C++ bằng Cython?
- 5. Phương pháp tĩnh Cython C++ trong một lớp mẫu
- 6. Tùy chọn cho linting Mã Cython
- 7. Bật Enum không nhập lớp
- 8. Sơ đồ lớp UML enum
- 9. jQuery quấn nhiều phần tử div trên cùng một lớp
- 10. Giữ bản đồ enum-to-object với lớp enum?
- 11. Có tên cho mẫu thiết kế này (tự động quấn quanh một lớp khác) không?
- 12. Hằng số enum chứa tất cả các hằng số enum của cùng một lớp enum
- 13. Mở rộng enum trong các lớp thừa
- 14. Lớp enum cuối cùng trong C++ 11
- 15. lớp enum trong QVariant trong QSettings
- 16. Lớp Kotlin enum trong hiệu năng Android
- 17. enum lớp như chỉ số mảng
- 18. Khai báo một enum trong một lớp
- 19. PHP: Quấn tất cả các chức năng của một lớp trong một lớp con
- 20. Truy cập enum từ một lớp khác
- 21. Nhiều Lớp Enum trong một Tệp Java
- 22. Lỗi in thử GoogleTest của lớp enum
- 23. C++ typedef enum của lớp khác?
- 24. Enum có nghĩa là lớp tĩnh?
- 25. Để quấn hoặc không quấn: Gói dữ liệu truy cập vào mặt tiền dịch vụ
- 26. Tốt cách nào để "quấn" lọ cho OSGi với Maven
- 27. Làm thế nào để làm cho một DIV không quấn?
- 28. Đặt enum bên ngoài "công khai" cho Python?
- 29. Enum hữu ích cho việc gì?
- 30. mảng numpy với cython
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
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
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