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
;
};
// class ...
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.