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]
namespacemtrandom{conststaticunsignedintN=624;classMT_RNG{public:MT_RNG();MT_RNG(unsignedlongs);MT_RNG(unsignedlonginit_key[],intkey_length);// initializes RNG state, called by constructorsvoidinit_genrand(unsignedlongs);// generates a random number on [0,0xffffffff]-intervalunsignedlonggenrand_int32();// generates a random number on [0,1]-real-intervaldoublegenrand_real1();private:unsignedlongmt[N];intmti;};// class ...