Python Cython:嵌套typedef的变通方法 我试图用Cython包一些C++代码。< /P> C++头文件“图.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() } #包括“Block.h” 模板类图 { 公众: 类型定义枚举 { 来源=0, 水槽=1 }termtype;//终端 typedef int node_id; 类型定义块D; 图() }

Python Cython:嵌套typedef的变通方法 我试图用Cython包一些C++代码。< /P> C++头文件“图.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() } #包括“Block.h” 模板类图 { 公众: 类型定义枚举 { 来源=0, 水槽=1 }termtype;//终端 typedef int node_id; 类型定义块D; 图() },python,cython,Python,Cython,我在“Graph.pyx”中尝试了以下内容: “graph.h”中的cdef外部: cdef类图[graphtype]: ctypedef int node_id ctypedef枚举术语类型: 来源 下沉 ctypedef块; 然而,这些都不起作用。我发现Cython可能不支持嵌套的typedef。如果这是真的,这个问题有解决办法吗 谢谢 我使用名称空间关键字获得了嵌套定义,指定了嵌套声明。比如,如果你在C++标题中有如下的名字: MyToo.HPP >: namespace MyStuf

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

“graph.h”中的cdef外部: cdef类图[graphtype]: ctypedef int node_id ctypedef枚举术语类型: 来源 下沉 ctypedef块; 然而,这些都不起作用。我发现Cython可能不支持嵌套的typedef。如果这是真的,这个问题有解决办法吗


谢谢

我使用
名称空间
关键字获得了嵌套定义,指定了嵌套声明。比如,如果你在C++标题中有如下的名字:<代码> MyToo.HPP >:

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++-land中的所有内容都封装在一个名称空间中(否则,第二个
cdef
在其声明中没有
名称空间,这在我看来更为复杂),那么它的阅读会更加连贯


我有一些现实世界中目前正在工作的例子:。图示的示例代码最初显示出来。

立即:您应该更改
ctypedef块
ctypedef Block[double]Block
——如果Cython编译器因为该行试图
typedef
而停止,请不要感到惊讶——将某个对象递归地无限地别名。如果不需要在Cython代码中显式使用
Block
,则始终可以删除该行(请记住,Cython
extern
定义不必包含它们检查的头文件中的所有内容,只需按名称使用)。
cdef extern from "mystuff.hpp" namespace "MyStuff::Outer":
    cppclass Inner:
        int value

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