GeekBand學(xué)習(xí)筆記-第八周 關(guān)于STL的使用之三

寫在前面:感謝GeekBand提供這樣好的學(xué)習(xí)機會,讓我在繁忙的工作之余可以學(xué)習(xí)鞏固c++知識。以下是邊學(xué)邊記的一些擴展點。分享給大家。

這次關(guān)于“Traits”的使用,是很實用的。由于C++本身沒有像C#, java 中類似類型的判斷,所以需要自己來寫。這次任務(wù)是寫一個Caltulator類的函數(shù),但是要針對不同的數(shù)據(jù)類型來處理。

假設(shè)有個計算類Calculator,它要處理int, long, float, double等數(shù)值類型。用模板實現(xiàn)GetLimit()方法,獲得每種類型的數(shù)值的上限LIMIT,比如int的上限是100,long的上限是 1000,float的上限是999.99,double的上限是888.8888888等等。

這樣的話,我們可以有兩種實現(xiàn)思路:用類(class)或者是結(jié)構(gòu)體(struct)

#include <iostream> // 為了輸出
#include <iomanip>  // 為了控制輸出效果
using namespace std;

//如果用結(jié)構(gòu)體,需要這樣處理

template <typename T>
struct CalculatorTraits { };
//先定義一個針對int的Trait。類似的,可以特化出針對其他類型的Trait。
template< >
class CalculatorTraits<int>
{
public:
    typedef int ValueType;
    CalculatorTraits() : limit(100) { }
    ValueType getLimit() { return limit; }
private:
    ValueType limit;
};
// 如何放置在Calculator類中。
template <typename T>
struct Calculator {
    typename CalculatorTraits<T>::ReturnType GetLimit() {
        return CalculatorTraits<T>::LIMIT;
    }   
};

//如果特化一個類,需要這樣來處理: 聲明一個含有template<>的類,即空參數(shù)列表
template<typename T> 
class CalculatorTraits {};
//再顯示指明類型,先看一個針對int類型的例子,你可以仿照這個推理出其他類型的代碼
template<>
struct CalculatorTraits<int> {
    typedef int ReturnType;
    static constexpr ReturnType LIMIT = 100;
};
//下面是在Calculator類中,怎么放置這個模板,以達到調(diào)用的目的。
template <typename T>
class Calculator
{
public:
    typedef CalculatorTraits<T> CalTraits;  
    typedef typename CalTraits::ValueType ValueType;    
    ValueType GetLimit() 
    { 
        CalculatorTraits<T> calTraits;
        return calTraits.getLimit(); 
    }
};

不管你用類還是結(jié)構(gòu)體,下面的調(diào)用方法是一樣的。注意,在輸出的時候需要用setprecision(10) 來控制顯示。否則的話,你就會被四舍五入的顯示困擾。

int main() {

    Calculator<int> cInt;
    Calculator<long> cLong;
    Calculator<float> cFloat;
    Calculator<double> cDouble;
    cout << "GetLimit(int):"<<cInt.GetLimit() << endl;
    cout << "GetLimit(long):" << cLong.GetLimit() << endl;
    cout << "GetLimit(float):" << cFloat.GetLimit() << endl;
    cout << "GetLimit(double):" <<setprecision(10) << cDouble.GetLimit() << endl;

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

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

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