在Cython中是否可以使用C++风格的内部typedef?

ali*_*i_m 5 c++ python oop cython

在C++中,可以声明属于类或结构的成员的类型别名:

struct Foo
{
    // internal type alias
    typedef int DataType;

    // ...
};
Run Code Online (Sandbox Code Playgroud)

有没有办法在Cython中做同样的事情?我尝试过最明显的方法:

cdef struct Foo:
    ctypedef int DataType
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

Error compiling Cython file:
------------------------------------------------------------
...
# distutils: language=c++

cdef struct Foo:
    ctypedef int DataType
   ^
------------------------------------------------------------

internal_typedefs_example.pyx:4:4: Expected an identifier, found 'ctypedef'
Run Code Online (Sandbox Code Playgroud)

这只是Cython的一个基本限制(我使用的是v0.21.2),还是有解决方法?


为什么要打扰内部typedef?有几个一般原因 - 这个以前的SO问题涵盖了其中的一些.

我感兴趣的具体案例是包装一组模板化的C++类,看起来像这样:

struct FooDataset
{
    typedef int DataType;
    typedef float ReturnType;

    // methods, other important stuff
};

struct BarDataset
{
    typedef long DataType;
    typedef double ReturnType;

    // methods, other important stuff
};

template <class Dataset>
class DataProcessor{

    DataProcessor(Dataset& input_data);

    typedef typename Dataset::DataType T;
    typedef typename Dataset::ReturnType R;

    T getDataItem();
    R computeSomething(); /* etc. */

    // do some other stuff that might involve T and/or R
};
Run Code Online (Sandbox Code Playgroud)

在结构内部使用typedef可以提供更好的封装,因为我只需要传递一个模板参数(Dataset类),而不是单独指定该类型的特定Dataset加号.T, R, ...Dataset

我意识到找到这种情况的解决方法并不困难 - 我最感兴趣的是得到关于内部typedef目前是否可以在Cython中使用的明确答案.

小智 2

据我所知,Cython 目前不支持此功能。但是你不能在结构体之外定义它吗?

Cython 目前并不是被设计为 C++ 的替代品,而是一种加速 Python 代码热点的方法。如果您需要更多涉及的内容,只需用 C++ 编写并公开 python 绑定即可。