Here are a couple of things I experienced using Cython to wrap my C++ library grakopp:
Assignment and Coercion
- I couldn’t find a nice way to wrap boost::variant. Although the direct approach works, an assignment to the variant requires an unsafe cast, but that also adds the overhead of a copy. To work around this, I used accessor functions (requires changing the C++ implementation).
- The operator= is not supported to declare custom assignment functions.
- There is no other way to add custom coercion rules. The support for STL container coercion is hardcoded in
Cython/Compiler/PyrexTypes.py
. This also makes the builtin coercions less useful. - string coercion seems to be unhappy quite often, so you have to cast to string or char* even constant strings.
Imports
- Relative cimports are not supported.
- Unintuitively, a corresponding pxd file is automatically included, which can not be supressed. So renaming its imports with “as” in a cimport is not possible.
- There is no sensible place to put shared pxd files. [Wiki] [Forum]
References and Initializers
- References can not be initialized with an assignment, so pointers or slow copies have to be used everywhere.
- Only the default constructor can be used to instantiate stack or instance variables.
Overloading
- Cython could not resolve function overloading which differed only in the constness of the return type.
Templates
- It’s not possible to write meta-extension classes for template classes directly – only extension types for specific instantiations. [Forum]
- It’s not possible to use non-type template arguments (as a workaround, you can use
ctypedef int THREE "3"
). [Forum] - It’s also not possible to instantiate function templates, but there is a similar workaround. [Forum]