2012-01-03 4 views
7

Estoy tratando de envolver C++ Code con Cython. Tengo una clase que utiliza un método de plantilla, pero no es una plantilla en sí.Cómo envolver la función/método de plantilla de C++ en Cython

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

A medida que la clase no es una plantilla, pero sólo el constructor, no puedo declarar la clase como una plantilla en Cython como este.

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

¿Cómo puedo ajustar el método de la plantilla?

+0

El soporte de Cython para C++ sigue siendo muy limitado, por lo que es muy probable que no pueda hacerlo. Sin embargo, no estoy seguro. Una solución alternativa que viene a la mente es especificar sobrecargas para los tipos con los que realmente usa este constructor. –

Respuesta

0

Fácil. (O creo que lo es) En la clase de C++, el miembro tiene una plantilla, mientras que en Cython, declaras que la clase tiene una plantilla. Cambiar el código, ya sea a:

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

Si es factible, oa:

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

Si Cython lo soporta.

No soy un experto en cython, así que puedo estar equivocado.

+0

El primero no es factible/equivalente, y el último no funciona como se presentó. (Sería interesante saber si hay algún soporte o alguna solución.) –

+0

A partir de la versión 0.19, la documentación solo menciona clases de plantilla, no métodos de plantilla. http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html –

+2

Según [this] (http: //docs.cython.org/src/userguide/wrapping_CPlusPlus.html # what-s-new-in-cython-v0-13-about-c), los métodos de plantilla no parecen ser compatibles, solo calsses de plantilla – maxywb

0

¿Qué tal Boost wrapper for cython?

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

Bienvenido a la versión 2 de Boost.Python, una biblioteca de C++ que permite la interoperabilidad sin fisuras entre C++ y el lenguaje de programación Python. La nueva versión ha sido reescrito desde cero, con una forma más cómoda y flexible interfaz, y muchas nuevas capacidades, incluyendo soporte para: referencias y punteros A nivel mundial registrada Tipo coacciones automática Cruz-Módulo Tipo Conversiones Función Eficiente La sobrecarga C++ a Python excepción traducción los argumentos por defecto argumentos clave Manipulación de objetos de Python en Exportación de C++ iteradores como Python iteradores cadenas de documentación

supongo que busca algo como esto, es que ya existe como parte de impulso biblioteca de C++ C++

+0

No estoy seguro de qué están tratando de decir. –

0

Para un método de plantilla no constructor, utilizando la siguiente clase no molde:

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

pude conseguir que esto funcione:

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

Eso no te puede ayudar si específicamente necesita un método de plantilla de constructor, pero parece que el soporte de Cython para los métodos de plantilla ha mejorado al menos ligeramente desde el momento en que se formuló originalmente esta pregunta.

Cuestiones relacionadas