Handout 4

Callback Functions


Introduction

Unlike other languages, C++ does not offer a native solution to the issue of passing a class's method as a callback function. In the C language these are known as functors and exist very commonly in many event driven applications. The main problem centers around the fact that multiple instances of a particular class will result in different memory locations for each instantiation. This leads to the need of having not only the method pointer but also a pointer to the instance itself. The problem's definition brings about an intuitive solution which falls within the realms of templates and compile time instantiation and specialization.

The Question

Q: How to use class member functions as callbacks?
A: The problem is that every callback function has its own prototype, which determines the parameters that gets passed from the operating system to it.

In C++ every member function has a hidden parameter - the so-called 'this' pointer which will be automatically passed to the function. C++ is able to associate a function with a particular instance of an object by means of the 'this' pointer. Member functions access member variables through the 'this' pointer...

Code:

class foo
{
public:
  void func() { integer_ = 0; }

private:
  int integer_;
};

If you compile this code it will be compiled as:


Code:

class foo
{
public:
  void func(foo* this) { this->integer_ = 0; }

private:
  int integer_;
};

The operating system does not call callback functions through objects therefore it cannot handle the automatically added 'this' pointer... To get a member functions working as a callback routine you need to tell the compiler explicitly not to expect a 'this' pointer. To avoid the automatic 'this' pointer you have two possibilities:

Non-member functions are not part of a class and therefore do not have a 'this' pointer. Static member functions do not receive a 'this' pointer either...thus, if you want to use a member function as a callback routine you need to declare it as 'static'...ha-ha-ha.

See Also

CALLBACKS IN C++ USING TEMPLATE FUNCTORS
Function Objects

Callbacks in C++

Imperfect C++: Functors and Ranges


* portions from here.