2012-01-03 12 views
7

Próbuję zawinąć niektóre C++ Code z Cython. Mam klasę, która wykorzystuje metodę szablonu, ale nie jest szablonem.Zawijanie funkcji/metody szablonu C++ w języku Cython

class SomeClass { 
    template <class T> SomeClass(T& spam); 
}; 

jako klasa nie jest szablon, ale tylko konstruktor, nie mogę zadeklarować klasę jako szablon w Cython takiego.

# wrong! 
cdef extern from "SomeClass.h": 
    cppclass SomeClass [T]: 
     SomeClass(T& spam) 

Jak zawinąć metodę szablonu?

+0

Obsługa C++ przez C++ jest nadal bardzo ograniczona, więc najprawdopodobniej nie można tego zrobić. Nie wiem jednak na pewno. Jednym z obejść, które przychodzi do głowy jest określenie przeciążenia dla typów, z których faktycznie korzysta ten konstruktor. –

Odpowiedz

0

Łatwo. (Lub myślę, że tak) W klasie C++ członek jest szablonem, podczas gdy w Cythonie deklarujesz, że klasa ma być szablonem. Zmień swój kod albo:

template <class T> 
class SomeClass { 
    SomeClass(T& spam); 
}; 

Jeśli to możliwe, lub do:

cdef extern from "SomeClass.h": 
    cppclass SomeClass: 
     SomeClass [T](T& spam) 

Jeśli Cython ją obsługuje.

Nie jestem ekspertem od cytonów, więc mogę się mylić.

+0

Ten pierwszy nie jest wykonalny/równoważny, a drugi nie działa tak, jak przedstawiono. (Byłoby interesujące dowiedzieć się, czy jest jakieś wsparcie lub jakieś obejście). –

+0

Od wersji 0.19 w dokumentacji wymieniono tylko klasy szablonów, a nie metody szablonów. http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html –

+2

Zgodnie z [this] (http: //docs.cython.org/src/userguide/wrapping_CPlusPlus.html # what-s-new-in-cython-v0-13-about-c), metody szablonów nie są obsługiwane, tylko szablon kręci się – maxywb

0

Co powiecie na zwiększenie pakowania cythonu?

http://www.boost.org/doc/libs/1_54_0/libs/python/doc/index.html

Witamy w wersji 2 Boost.Python, C++ biblioteka, która umożliwia bezproblemową współpracę z C++ i język programowania Python. Nowa wersja została przepisana od nowa, z wygodniejszym i bardziej elastycznym interfejsem oraz wieloma nowymi funkcjami, w tym obsługą: Referencje i wskaźniki Globalnie zarejestrowane typy konwersji Automatyczne konwersje z różnymi typami modułów Efektywne przeciążanie funkcji C++ Python wyjątek translacji domyślne argumenty argumentów kluczowych Manipulowanie Python obiektów w C++ eksportowanie C++ iteratory jak Python Iteratory Dokumentacja Strings

Chyba szukasz czegoś takiego, to już nie w ramach doładowania biblioteka C++

+0

Nie jestem pewien, co ty próbują powiedzieć. –

0

Dla non-konstruktora metody szablonu, stosując następujące klasy non-Szablon:

class SomeClass { 
    template <class T> void other(T& spam); 
}; 

udało mi się uzyskać to do pracy:

cdef extern from "someclass.h": 
    cppclass SomeClass: 
     void other[T](T &spam) 

To nie może pomóc, jeśli konkretnie potrzebna jest metoda szablonu konstruktora, ale wydaje się, że wsparcie dla metod szablonów w Cython poprawiło się przynajmniej nieznacznie od czasu, kiedy pytanie to zostało pierwotnie zadane.