2016-05-12 17 views
3

Ich versuche, einige C++ Code mit Cython zu wickeln.Cython: Workaround für verschachtelte typedefs

Die C++ Header-Datei "graph.h" enthält folgende Definition:

#include "Block.h" 
template <typename graphtype> class Graph 
{ 
public: 
     typedef enum 
     { 
       SOURCE = 0, 
       SINK = 1 
     } termtype; // terminals 
     typedef int node_id; 
     typedef Block<double> Block_D; 

     Graph() 
} 

Ich habe versucht, die folgenden in "Graph.pyx":

cdef extern from "graph.h": 
    cdef cppclass Graph[graphtype]: 
     ctypedef int node_id 
     ctypedef enum termtype: 
      SOURCE 
      SINK 
     ctypedef Block<double> Block; 

jedoch keiner der Arbeit. Ich habe festgestellt, dass Cython geschachtelte Typdefinitionen möglicherweise nicht unterstützt. Wenn das stimmt, gibt es eine Problemumgehung für dieses Problem?

Danke!

+0

Direkt von der Fledermaus: Sie sollten 'ctypedef Block Block ändern;' zu 'ctypedef Block [double] Block' - und dann nicht überrascht sein, wenn der Cython-Compiler balckt, weil diese Zeile versucht, 'typedef'-Alias etwas rekursiv * ad infinitium *. Sie können diese Zeile immer löschen, wenn Sie 'Block' nicht explizit in Ihrem Cython-Code verwenden müssen (denken Sie daran, dass Cython' extern' -Definitionen nicht * alles * von den Header-Dateien enthalten müssen, die sie untersuchen, nur was Sie brauchen mit Namen zu verwenden). – fish2000

Antwort

1

Ich habe geschachtelte Definitionen zu arbeiten mit dem Schlüssel namespace, Angabe der verschachtelten Deklaration. Wenn Sie z.B. die folgend in einem C++ Header mystuff.hpp genannt:

namespace MyStuff { 
    struct Outer { 
     struct Inner { 
      int value; 
     }; 
     Inner member; 
    }; 
} 

... Sie können diese Strukturen encython wie so:

cdef extern from "mystuff.hpp" namespace "MyStuff::Outer": 
    cppclass Inner: 
     int value 

cdef extern from "mystuff.hpp" namespace "MyStuff": 
    cppclass Outer: 
     Inner member 

... es liest mehr kohärent, wenn Sie tatsächlich alles in C haben ++ - Land in einem Namensraum eingewickelt , wie geschrieben (sonst hat die zweite cdef keine namespace in ihrer Deklaration, die IMO wierder aussieht).

Ich habe eine Reihe von real-world derzeit Arbeitsbeispiele davon: one such example is here, another one is here.

Ich postete ursprünglich dieses Beispiel as this answer.