寫在前面:感謝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;
}