// The base class
template<class Crtp, class MsgT>
class Receiver { 
  void receive(MsgT) {
    static_cast<Crtp*>(this)->private_ += 1;
  }
};


// The derived class
template<class MsgT>
struct Dispatcher :
  public Receiver<Dispatcher<MsgT>, MsgT>
{
  //_private member exposed to the base class, called Receiver
  using Receiver<Dispatcher, MsgT>::Receiver;
  friend Receiver<Dispatcher, MsgT>;

private:
  int private_;
};