2012-01-03 31 views
7

我想用Cython包装一些C++代码。我有一个使用模板方法的类,但不是模板本身。Cython中包装C++模板函数/方法

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

由于该类不是一个模板,但只有构造函数,我不能声明类像这样在用Cython的模板。

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

如何包装模板方法?

+0

Cython对C++的支持仍然非常有限,所以很可能你不能。但我不确定。想到的一个解决方法是为实际使用此构造函数的类型指定重载。 – 2012-01-03 17:02:38

回答

0

简单。 (或者我认为是)在C++类中,成员是模板化的,而在Cython中,您声明该类是模板化的。更改您的代码要么:

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

如果可行的话,或邮寄至:

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

如果用Cython支持它。

我不是一个cython专家,所以我可能是错的。

+0

前者是不可行的/等同的,而后者不如前述那样工作。 (知道是否有一些支持或解决方法会很有趣。) – 2013-07-01 18:39:37

+0

从版本0.19开始,文档只提到模板类,而不提供模板方法。 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html – 2013-07-01 19:09:52

+2

按照[this](http://docs.cython。org/src/userguide/wrapping_CPlusPlus.html#what-s-new-in-cython-v0-13-about-c),模板方法似乎不被支持,只有模板calsses – maxywb 2013-07-03 17:43:25

0

对于cython的Boost包装怎么样?

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

欢迎的Boost.Python的版本2中,C++库,它使C++和Python编程语言的无缝互操作。新版本已经从地上爬起来重写,以更加方便和灵活的接口,以及许多新功能,其中包括支持: 引用和指针 全局注册类型强制 自动跨模块类型转换 高效的函数重载 C++ Python的异常翻译 默认参数 关键参数 操纵Python对象在C++ 出口C++迭代器为Python的迭代器 文档字符串

我猜你正在寻找这样的事情,它已经在那里为升压的C部分++库

+0

我不确定你是什么正试图说。 – 2013-07-04 19:09:37

0

对于非构造模板方法,使用下面的非模板类:

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

我能得到这个工作:

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

这可能不会帮助你,如果你特别需要一个构造函数模板方法,但似乎Cython对模板方法的支持至少在最初提出这个问题的时候有所改善。