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;
}