Chapter 8. Wrapping C++ Libraries with Cython

There are only two kinds of languages: the ones people complain about and the ones nobody uses.

— B. Stroustrup

Using Cython to wrap C++ has much in common with using it to wrap C: we must declare the C or C++ interface we want to wrap in an extern block; we must define Python-accessible functions and extension types that wrap the library; and we must convert Python types to and from C or C++ types when Cython cannot apply automatic conversions.

But C++ is a much larger and more complex language than C. To deal with this added complexity and the additional language constructs, Cython has C++-specific syntax to help.

In this chapter, we will cover all of Cython’s C++ wrapping features. Using them, we will learn how to wrap most C++ constructs in Python.

To get an overview, let’s wrap a simple C++ class from end to end.

Simple Example: MT_RNG Class

To extend our example in Chapter 7, suppose we reimplement our random-number generator in a simple C++ class with the following interface:[14]

namespace mtrandom {

const static unsigned int N = 624;

class MT_RNG {
  public:
    MT_RNG();
    MT_RNG(unsigned long s);
    MT_RNG(unsigned long init_key[], int key_length);

    // initializes RNG state, called by constructors
    void init_genrand(unsigned long s);

    // generates a random number on [0,0xffffffff]-interval
    unsigned long genrand_int32();

    // generates a random number on [0,1]-real-interval
    double genrand_real1();

  private:
    unsigned long mt[N];
    int mti;

Get Cython now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.