The challenge here is that the tendency to use std::bind to generate callable objects leads to painful issues when attempting compile-time dispatch. These issues are solved by lambdas for complex functions, or via encapsulation for simpler ones.
[x] add dispatch for empty callbacks
[x] update type traits to reflect that empty callbacks are valid
[x] update existing callback types to be empty if that is their current behavior.
This PR is a WIP addressing #74.
The challenge here is that the tendency to use
std::bind
to generate callable objects leads to painful issues when attempting compile-time dispatch. These issues are solved by lambdas for complex functions, or via encapsulation for simpler ones.