#include class Arg { public: template Arg (Type arg) { TheArg = (void *) arg; } template void run (void (*f)(Type)) const { f ((Type) TheArg); } private: void *TheArg; }; void print_int (int i) { cout << i << endl; } class A { public: virtual void run (const Arg & a) = 0; }; class B : public A { public: void run (const Arg & a) { a.run (print_int); } }; int main (void) { A *a = new B (); a->run (Arg (1)); a->run (Arg (2)); }