有如下題目:
假設(shè)有個(gè)計(jì)算類Calculator,它要處理int, long, float, double等數(shù)值類型。用模板實(shí)現(xiàn)GetLimit()方法,獲得每種類型的數(shù)值的上限LIMIT,比如int的上限是100,long的上限是 1000,float的上限是999.99,double的上限是888.8888888等等。
在做這題之前,我對(duì)C++的traits一直不大理解,然后STL課程的老師也是講得模棱兩可,直到做這道題,體會(huì)到traits的好處才對(duì)traits有了深一步的了解,所以寫(xiě)文章記錄一下。
當(dāng)時(shí)看到這題目的時(shí)候,我就想,首先是才用模板的知識(shí)來(lái)解決這個(gè)問(wèn)題,但是有一個(gè)問(wèn)題,因?yàn)槊糠N類型的數(shù)值的上限是不一樣的,那么如何令GetLimit( )能夠返回與類型相對(duì)應(yīng)的LIMIT呢?也就是LIMIT是這個(gè)類型的一個(gè)特性。
特性然后就想到了traits。
這時(shí)候回過(guò)頭來(lái)想,才明白traits的作用,簡(jiǎn)單來(lái)說(shuō),用來(lái)表示不同類型的特性。
既然明白了traits是什么和有什么作用,那么如何實(shí)現(xiàn)traits?
traits可以實(shí)現(xiàn)為模板類,這也很正常,用模板類可以進(jìn)行針對(duì)不同類型的特化,從而實(shí)現(xiàn)不同的特性。通常這個(gè)模板類的命名為一般CLASSTraits。CLASS為使用到Traits的類的名稱。
如果要特化一個(gè)類,那么做法是:
1.聲明一個(gè)帶template<>的類,即空參數(shù)列表。
template<typename T>
class CalculatorTraits {};
2.在類名稱后面緊跟的尖括號(hào)中顯式指明類型。
template< >
class CalculatorTraits<int>
{
public:
typedef int ValueType;
CalculatorTraits() : limit(100) { }
ValueType getLimit( ) { return limit;}
private:
ValueType limit;
};
template< >
class CalculatorTraits<long>
{
public:
typedef long ValueType;
CalculatorTraits() : limit(1000) { }
ValueType getLimit( ) { return limit;}
private:
ValueType limit;
};
template< >
class CalculatorTraits<float>
{
public:
typedef float ValueType;
CalculatorTraits() : limit(999.99) { }
ValueType getLimit( ) { return limit;}
private:
ValueType limit;
};
template< >
class CalculatorTraits<double>
{
public:
typedef double ValueType;
CalculatorTraits() : limit(888.8888888) { }
ValueType getLimit( ) { return limit;}
private:
ValueType limit;
};
好了,定義好相關(guān)的Traits,那么該如何使用呢?
template <typename T>
class Calculator
{
public:
typedef CalculatorTraits<T> CalTraits; //為后續(xù)書(shū)寫(xiě)方便
typedef typename CalTraits::ValueType ValueType; //為后續(xù)書(shū)寫(xiě)方便
ValueType GetLimit()
{
CalculatorTraits<T> ct;//由于GetLimit是返回每個(gè)類型的上限,所以可以利用traits中存儲(chǔ)了該類別的特性的特點(diǎn)
//即可實(shí)現(xiàn)題目要求。
return ct.getLimit();
}
};
我腦海里想象的是trais相當(dāng)于每個(gè)類型的信息卡,里面記錄這這個(gè)類型的特性。
好了,STL課程到此位置,但感覺(jué)STL許多知識(shí)還沒(méi)有學(xué)懂,需要時(shí)間好好琢磨琢磨。