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

时间:2015-02-07 13:18:51

标签: python c++ oop cython

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

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

    // ...
};

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

cdef struct Foo:
    ctypedef int DataType

但这不起作用:

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

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

internal_typedefs_example.pyx:4:4: Expected an identifier, found 'ctypedef'

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


为什么要打扰内部typedef?有几个一般原因 - this previous SO question涵盖其中一些。

我感兴趣的具体案例是包装一组模板化的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
};

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

我意识到为这种情况找到解决方法并不困难 - 我主要只是想知道在Cython中当前是否可以使用内部typedef来确定答案。

2 个答案:

答案 0 :(得分:1)

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

Cython目前还没有被设计为C ++的替代品,而是一种加速python代码热点的方法。如果你需要更多涉及的东西,只需用C ++编写它并公开python绑定。

答案 1 :(得分:0)

在C ++中,struct is a keyword to declare a class。因此,内部typedef可以在Cython中声明为:

cdef cppclass Foo:
    ctypedef int DataType