Cython:嵌套typedef的解决方法

4

我正在尝试使用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可能不支持嵌套的typedefs。如果是这样,那么有没有解决此问题的方法?

谢谢!


首先,你应该将 ctypedef Block<double> Block; 改为 ctypedef Block[double] Block - 然后不要惊讶,如果Cython编译器因为这一行试图无限递归地 typedef-alias某些东西而出现错误。如果你在Cython代码中不需要显式使用 Block,那么你可以随时删除该行(请记住,Cython的 extern 定义不必包括它们检查的头文件中的 所有 东西,只需按名称使用所需内容)。 - fish2000
1个回答

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,这看起来有些奇怪)。我有许多实际工作中正在运行的示例:其中之一在此处另一个在此处。这个演示性的示例代码最初出现在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接