#ifndef SIX_H #define SIX_H namespace six { struct IPrintable { virtual void print(const char* ) = 0; }; struct Printer { void print() { std::cout << "print internal printJob" << std::endl; } }; struct Fax { void fax(const char* something) { std::cout << "fax & print " << something << std::endl; } }; template void adapt( T* t, const char* something) { t->print(something); } template <> void adapt( Fax* t, const char* something) { t->fax(something); } template <> void adapt( Printer* t, const char* something) { t->print(); } template struct PrintableAdapter : IPrintable { PrintableAdapter(T* t) : t_(t){} virtual void print(const char* something) { adapt(t_, something); } private: T* t_; }; void test() { Fax f; PrintableAdapter paf(&f); IPrintable* p = &paf; p->print("something"); Printer pr; PrintableAdapter pap(&pr); p = &pap; p->print(0); } } #endif