2016-12-16 7 views
3

私はC++プログラムをビルドしてCythonで入手していますが、ここではC++ 11を入手しようとしていますが、確かに動作しません。ここでC++ 11配列とCythonのインターフェイス

は私.pxdです:

cdef extern from "<array>" namespace "std" nogil : 
    cdef cppclass array[T, size_t]: 
     ctypedef T value_type 
     cppclass iterator: 
      T& operator*() 
      iterator operator++() 
      iterator operator--() 
      iterator operator+(size_t) 
      iterator operator-(size_t) 
     bint operator==(iterator) 
     bint operator!=(iterator) 
     bint operator<(iterator) 
     bint operator>(iterator) 
     bint operator<=(iterator) 
     bint operator>=(iterator) 
     T& operator[](size_t) 
     array() except + 
     array(array&) except + 

は、このファイルのほとんどは、「vector.pxd」から適応ですが、C++ 11 arrayがそれを必要としないので、私はアロケータを削除しました。私はsize_tを第2のテンプレート引数として使用しましたが、わかりません。

問題は私が行うとき、次のとおりです。

from array11 cimport array 
    cdef array[int, 5] test 

コンパイルするとき、私は、取得:

未知のタイプをテンプレート引数

に私が行う場合:

from array11 cimport array 
    cdef array[int, 5] * test = new array[int, 5]() 

私は取得:

new演算子はC++クラス

私が間違っているのかについての任意のアイデアを適用することができますか?

ありがとうございます!

+2

cythonは非型テンプレートをサポートしていますか? – AndyG

+0

正しい質問かもしれません! –

+0

@AndyGいいえ、それはノンタイプのテンプレートをサポートしていません – DavidW

答えて

3

コメントで説明したように、Cythonは実際には非型テンプレート引数をサポートしていないため、問題があります。 (ハックおそらく壊れやすい)workroundは、型テンプレート引数を提供するの考え方にCythonをだましている:

cdef extern from "<array>" namespace "std" nogil : 
    cdef cppclass two "2": 
     pass 

    cdef cppclass array[T, U]: 
     T& operator[](size_t) 
     # this is obviously very very cut down 

def f(): 
    cdef array[int,two] x 
    return x[0]+x[1] 

トリックはあなたがcdef cppclass name "somestring"をすればCythonはただやみくもに正しいCを生成する、名前のためにsomestringに取って代わるだろうということです++コード。明らかにこのアプローチにはいくつかの制限がありますが、簡単な使い方ではうまくいくはずです。

+0

うわー。それは壊れやすいかもしれませんが、それはハッキーかもしれませんが、それは本当に創造的です。 –

関連する問題