#include <iostream>using namespace std;//当CD不使用模板参数时填充此类class CNull...{public: static CNull* instance() ...{ return &m_oCNull; }private: static CNull m_oCNull;};CNull CNull::m_oCNull;class CA...{public: static CA* instance() ...{ return &m_oCA; } void f1() ...{ //do something... cout << "CA.f1()" << endl; }private: static CA m_oCA;};CA CA::m_oCA;class CB...{public: static CB* instance() ...{ return &m_oCB; } void f2() ...{ //do something... cout << "CB.f2()" << endl; }private: static CB m_oCB;};CB CB::m_oCB;class CC...{};//此类有两个模板参数template <class T1, class T2>class CD...{public: CD() ...{ m_pT1 = T1::instance(); m_pT2 = T2::instance(); } ~CD() ...{ m_pT1 = NULL; m_pT2 = NULL; } T1* getT1() ...{ return m_pT1; } T2* getT2() ...{ return m_pT2; }private: T1* m_pT1; T2* m_pT2;};int main()...{ //当两个模板参数都被使用时 CD<CA, CB> d; d.getT1()->f1(); //因为CA有函数f1,所以成功 d.getT2()->f2(); //因为CB有函数f2,所以成功 //当只有一个模板参数被使用时,将第二个参数设为CNull CD<CA, CNull> d2; d2.getT1()->f1(); //因为CA有函数f1,所以成功 d2.getT2()->f2(); //因为CNull没有函数f2,所以编译时出错 //当错误的使用了不带instance函数的类CC时,会编译时出错 CD<CC, CC> d3; return 0; }