#include <stdio.h> #include <tchar.h> /////////////////////////////////////////////////////////////////////////////// struct Operand1 { int GetOp1() { return 2; } int GetOp2() { return 3; } }; struct Operand2 { int GetOp1() { return 3; } int GetOp2() { return 4; } }; /////////////////////////////////////////////////////////////////////////////// template<class T> struct CalcEngine1 { int Calc(void) { T* pThis= (T*)this; return pThis->GetOp1() / pThis->GetOp2(); } }; template<class T> struct CalcEngine2 { double Calc(void) { T* pThis= (T*)this; return pThis->GetOp1() / (double) pThis->GetOp2(); } }; /////////////////////////////////////////////////////////////////////////////// template < class OperandPolicy, template<class CalcEngine> class CalcEnginePolicy > class Calculator : public OperandPolicy, public CalcEnginePolicy<OperandPolicy> { public: void Show (void) { printf ("Show()=%f\r\n", CalcEnginePolicy<OperandPolicy>::Calc() ); } }; /////////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { Calculator <Operand1,CalcEngine1> a; Calculator <Operand1,CalcEngine2> b; Calculator <Operand2,CalcEngine1> c; Calculator <Operand2,CalcEngine2> d; a.Show(); b.Show(); c.Show(); d.Show(); return 0; }