PlusCallback Usage Summary
This page describes basic usage, examples, and tips for using PlusCallback, the C++ callback library.
Basic Usage
Step 1 - Include the library
The entire library is self-contained in one file. To use it in your project, you only need to include it.
#include <callback.hpp>
Step 2 - Have some things to call
You'll need something to call. It'll probably be some complicated object, or maybe just a function.
struct Dog
{
void Bark(int volume);
};
struct Cat
{
void Meow(int volume);
};
Dog spot, rover; //We have two dogs
Cat felix; //and one cat.
//Define a normal function.
void Func(int a);
Step 3 - Use a callback
The PlusCallback library is contained in the namespace cb. The class for implementing callbacks is called CallbackX, where X is the number of parameters the callback function takes. This class is templated, and the template parameters are the function return type, followed by each parameter's type.
//Define a callback to a function returning void and taking
//one int parameter.
cb::Callback1<void, int> speak;
//Point this callback at spot's Bark method.
speak.Reset(&spot, &Dog::Bark);
speak(50); //Spot barks loudly.
speak.Reset(&rover, &Dog::Bark);
speak(60); //Rovers lets out a mighty bark.
speak.Reset(&felix, &Cat::Meow);
speak(30); //Felix meows.
Step 4 (Optional) - Get fancy
PlusCallback defines flexible, robust objects. Go ahead and copy them, reset them, and put them in containers. That's what they're there for.
//Callbacks can be set to free functions.
speak = Func;
//Copy and assignment operators are well defined.
cb::Callback1<void, int> copy = speak;
assert(copy == speak);
//Callbacks can be set to null.
copy.Reset();
assert(!copy.IsSet());
//Callbacks are container safe with a well defined sort order.
std::set<cb::Callback1<void, int> > container;
container.insert(speak);
container.insert(copy);
//Use the helper function MakeX to quickly create callback objects.
container.insert(cb::Make1(&spot, &Dog::Bark));
container.insert(cb::Make1(&rover, &Dog::Bark));
container.insert(cb::Make1(&felix, &Cat::Meow));