2

I'm currently doing a Cython wrapper for an existing C++ library. I have an overloaded non-member operator in C++ like

Data operator+(Data const& a, Data const& b)

And in the pxd file describing the header, I wrote

cdef extern from 'blabla.h':
    Data operator+(const Data&, const Data&)

Now how can I use this operator+ in another pyx file?

Hot.PxL
  • 1,902
  • 1
  • 17
  • 30

1 Answers1

4

For very simple cases, like in your example you can lie to Cython and tell it that the operator is a member function:

cdef extern from 'blabla.h':
  cdef cppclass Data:
    # the rest of the data definitions
    Data operator+(const Data&)

It only uses this information to know that it can translate the code a+b (where a and b are data objects) to __pyx_v_a + __pyx_v_b and let the c++ compiler do the rest (which it knows how to because of the import from "blabla.h"). Therefore, the distinction between member and non-member is irrelevant.

However: one of the main reasons to use nonmember operators is to allow things like

Data operator+(int a, const Data& b);

You can make this work, but it's very slightly messy. In your pxd file do

cdef extern from 'blabla.h':
    Data operator+(int, const Data&) # i.e. do nothing special

In your pyx file

from my_pxd_file import * # works fine
## but this isn't accepted unfortunately:
from my_pxd_file import operator+

If you wanted to avoid too much namespace pollution from doing import *, you could probably create a pxd file that only contains operators and not the class definitions (I haven't tested this though)

In conclusion - two methods depending on how complicated your use-case is...

DavidW
  • 29,336
  • 6
  • 55
  • 86