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 绑定即可。