Listing 6: Implementation of callback that uses templates

// Callback.C

static void    callbackHandler(Widget, XtPointer, XtPointer);

/* fake object */
class FakeObj;

typedef void (FakeObj::*p_func)(Widget, XtPointer, XtPointer);

typedef CallbackInfo<FakeObj> FakeCallbackInfo;

void callbackHandler(Widget w, XtPointer udata, XtPointer cdata)
{

   FakeCallbackInfo *ci = (FakeCallbackInfo *)udata;

   FakeObj *obj = ci->obj;
   p_func mf    = ci->func;

   (obj->*(mf))(w, ci->udata, cdata);
}

void registerCallback(void *info)
{
   if (info == NULL) return;

   FakeCallbackInfo *ci = (FakeCallbackInfo *) info;

   /* install handler */
   XtAddCallback(ci->w,
                 ci->cbType,
                 (XtCallbackProc)callbackHandler,
                 (XtPointer)info);
}
//End of File