In C++ it's possible to declare type aliases that are members of a class or struct:
struct Foo
{// internal type aliastypedef int DataType;// ...
};
Is there any way to do the same thing in Cython? I've tried the most obvious approach:
cdef struct Foo:ctypedef int DataType
But this doesn't work:
Error compiling Cython file:
------------------------------------------------------------
...
# distutils: language=c++cdef struct Foo:ctypedef int DataType^
------------------------------------------------------------internal_typedefs_example.pyx:4:4: Expected an identifier, found 'ctypedef'
Is this just a fundamental limitation of Cython (I'm using v0.21.2), or is there a workaround?
Why bother with internal typedefs? There are several general reasons - this previous SO question covers a few of them.
The specific case I'm interested in is wrapping a set of templated C++ classes that look something like this:
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
};
Having typedef(s) internal to the struct gives me better encapsulation since I only need to pass a single template parameter (the Dataset
class) rather than individually specifying the Dataset
plus T, R, ...
specific to that Dataset
type.
I realise that it's not too difficult to find workarounds for this case - I'm mostly just interested in getting a definitive answer as to whether or not internal typedefs are currently possible in Cython.