2012-01-03 26 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對模板方法的支持至少在最初提出這個問題的時候有所改善。