2015-06-29 13 views
11

Bài toán

Tôi có một lớp mẫu trong C++ có phương pháp tĩnh. Có vẻ ít nhiều giống như thế này:Phương pháp tĩnh Cython C++ trong một lớp mẫu

template<typename T> 
class Foo { 
    static std::shared_ptr<Foo<T>> doSth(); 
} 

vì vậy trong C++ bạn gọi nó là: Foo<Int>::doSth();. Tuy nhiên, trong Cython, cách gọi phương thức tĩnh là sử dụng tên lớp như một không gian tên:

cdef extern from "Bar.h" namespace "Bar": 
    shared_ptr[Bar] doSth() # assuming shared_ptr is already declared 

nhưng điều này không có khái niệm về mẫu. Rõ ràng, chỉ cần đi qua Foo<T> như một namespace không hoạt động, bởi vì nó dịch để Foo<T>::doStr() trong C++, không có loại bê tông được thay thế cho T.

Câu hỏi

Làm thế nào bạn sẽ làm điều đó trong Cython? Có cách nào hay giải pháp khác?

+0

nên không làm việc này như đã giải thích cho các phương pháp không tĩnh trong tài liệu? http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#templates –

+0

Thật không may là không. Viết 'cdef extern từ không gian tên" Foo.h "" Foo ": shared_ptr [Foo [T]] doSth [T]()' cũng không hoạt động. Đó là bởi vì cython tạo ra mã C++ như: 'Foo :: doSth ();' - tham số mẫu sau khi Foo bị thiếu. – piotrMocz

Trả lời

3

Lưu ý: Câu trả lời này đúng vào thời điểm được viết (và vẫn hoạt động) nhưng bây giờ bạn nên sử dụng @Robertwb's answer to this question instead để thực hiện việc này đúng cách.


Tôi không nghĩ bạn có thể thực hiện trực tiếp trong Cython. Bạn có thể tạo wrapper rất mỏng của một (không tĩnh-method) bình thường C++ template function

template <typename T> 
std::shared_ptr<Foo<T>> Foo_T_doSth<T>() { 
    return Foo<T>::doSth(); 
} 

và sau đó quấn phương pháp này trong Cython

cdef extern from "..." 
    shared_ptr[T] Foo_T_doSth[T]() 

Là một sang một bên, cách đề nghị bao gồm các phương pháp tĩnh trong Cython có vẻ như (từ https://groups.google.com/forum/#!topic/cython-users/xaErUq2yY0s)

cdef extern from "...": 
    cdef Foo_doSth "Foo::doSth"() # not declared as a memeber 

(bằng cách chỉ định ac chức năng tual để sử dụng như một chuỗi). Điều này không giúp bạn ở đây vì nó không đối phó với các mẫu. Có thể tôi đã từng khuyên bạn về cách bạn đang thử ...

+0

Gói nó hoạt động tốt cho tôi, cảm ơn bạn một lần nữa. Tôi đã chỉ hy vọng tôi có thể tránh tinkering xung quanh mã C + + của tôi, nhưng nó vẫn siêu mát mẻ. Tôi sẽ chuyển sang cách được đề xuất :) – piotrMocz

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