【GeekBand】C++面向?qū)ο蟾呒?jí)編程-第八周筆記

有如下題目:
假設(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í)間好好琢磨琢磨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容