Cython:嵌套typedef的解决方法

时间:2016-05-12 11:14:10

标签: python cython

我试图用Cython包装一些C ++代码。

c ++头文件“graph.h”包含以下定义:

#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()
}

我在“Graph.pyx”中尝试了以下内容:

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

然而,这些都不起作用。我发现Cython可能不支持嵌套的typedef。如果这是真的,是否有针对此问题的解决方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

我已经使用namespace关键字使嵌套定义工作,指定嵌套声明。就像,如果你有例如以下名为mystuff.hpp的C ++标头中的以下内容:

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

......你可以像这样结构那些结构:

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

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

...如果你真的拥有C ++中的所有内容,它会更加连贯地读取 - 写入命名空间中的地方(否则第二个cdef在其声明中没有namespace,看起来更加狡猾的IMO)。

我有许多现实世界的实例:one such example is hereanother one is here。图示的示例代码最初显示为here