在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来确定答案。
答案 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