Cython:如何将 C++ class 导出为 .hpp header 而不是 C .h header

Cython: How to export C++ class to .hpp header instead of C .h header

这在 .pxd 文件中工作正常:

cdef public:
    struct foo:
        float bar

但这行不通:

cdef public:
    class foo:
        float bar # Syntax error in simple statement list

这有效,但 Cython 仍在制作 struct 而不是 class,并且生成的文件是 .h 文件而不是 .hpp(或 .hh)文件:

cdef public:
    cppclass foo:
        float bar

我的文件名为 mod.pyx,Cython 将上方的 cppclass 转译为:

#ifndef __PYX_HAVE__mod
#define __PYX_HAVE__mod

#include "Python.h"
struct foo;
struct foo {

  /* "mod.pyx":21
 *
 * cdef public:
 *     cppclass foo:             # <<<<<<<<<<<<<<
 *         float bar
 *
 */
  float bar;
};

如何从 Cython 转译中生成真正的 C++ 输出?我的意思是 .hpp 或 .hh 文件里面有 class 关键字。可以使用单独的 C++ header 文件来代替,但我想使源代码完全 Cython。

转译指令为:
cython3 -3 --cplus --fast-fail mod.pyx

我已经弄清楚如何仅在 Cython 中定义 C++ class(不是 Python 扩展类型 'class');它仍然被转译到 .h 文件 struct 但是 里面有方法 :

# Declaration
cdef public:
    cppclass foo:
        float bar
        foo() # Constructor
        method() # Sample method

# Implementation
cdef cppclass foo:
    method():
        cdef foo* p = this # 'this' can be used
        print(p.bar+1) # Test

有一些注意事项:

  • nullary 构造函数是必须的,Cython 是这么说的
    • 这不需要构造函数:cdef foo* f = new foo()
    • 这需要一个构造函数:cdef foo f = foo()
      • 或错误:no constructor found for C++ type 'foo'
  • Python 中没有重载,适用于 Cython,因此没有构造函数重载(?);改为由方法设置的属性