Listing 7

template <class T>
class DeletableSingleton {
public:
  static void ScheduleDestruction(T*, void (*pFun)()) {
    static bool firstPass = true;
    isDead = false;
    deleter = pFun;
    if (firstPass) {
      std::atexit(GracefulDelete);
      firstPass = false;
    }
  }
  static void OnDeadReference() { }
  static void GracefulDelete();
protected:
  static void (*deleter)();
  static bool isDead;
};
template <class T> void (*DeletableSingleton<T>::deleter)();
template <class T> bool DeletableSingleton<T>::isDead = true;
template< class T >
void DeletableSingleton<T>::GracefulDelete() {
  if (isDead) return;
  isDead = true;
  deleter();
}