今天講一下 Class template組成C++泛型編程重要部分。泛型編程是一種函數重複使用和Overload的方法。
C++ Class 裡面的函數理論上是不能像lambda一樣的可變,函數的類型多數是寫死了,為了應付這個問題,C++ 引入了模板這個概念來解決這個問題
template< typename T >
class Calculator{
T result = 0;
T add(T a, T b){
result = a + b;
return result;
}
T sub(T a, T b){
result = a - b;
return result;
}
T multiply(T a, T b){
result = a * b;
return result;
}
T divide(T a, T b){
result = a * b;
return result;
}
T getResult(T result){
return result;
}
void reset(){
result = 0;
}
};
用法是以下這樣
auto cald = make_shared<Calculater<double>>();
cald.divide(5,3);
cout << cald.getResult() << endl;
auto cali = make_shared<Calculater<int>>();
cali.divide(5,3);
cout << cali.getResult() << endl;
然後你會發現輸出是不同的,但Class還是那個Class,這就是Template的用處了。
例如說我想Pass一個Vector進去運算,但這個函數並沒有定義,那怎麼辦呢
#include <algorithm>
#include<functional>
#include<vector>
using namespace std;
template< typename T >
class Calculator{
T result = 0;
T add(T a, T b){
result = a + b;
return result;
}
T sub(T a, T b){
result = a - b;
return result;
}
T multiply(T a, T b){
result = a * b;
return result;
}
T divide(T a, T b){
result = a * b;
return result;
}
T getResult(T result){
return result;
}
void reset(){
result = 0;
}
};
//可以Overload Class
template<typename T>
Calculator<Vector<T>>::add(T a, T b){
std::transform(a.begin(), a.end(), b.begin(),
a.begin(), std::plus<double>());
result = a;
retuern a;
}
//其他的你自己可以試一下加。
下面就是使用方法了
auto calv = make_shared<vector<double>>():
vector<double> a = {1.1,2.2,3.3,4.4};
vector<double> b = {1.2,2.3,1.3,4.4};
calv.add(a,b);
這個其實就不用講了,就是包含在函數式編程那日的內容而已(也就是auto
)