iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
Software Development

C++ 30天屠龍記系列 第 24

C++ 30天屠龍記(第24天): C++模板

  • 分享至 

  • xImage
  •  

今天講一下 Class template組成C++泛型編程重要部分。泛型編程是一種函數重複使用和Overload的方法。

Class模板

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的用處了。

Class Overloading

例如說我想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


上一篇
C++ 30天屠龍記(第23天): 今天的主題是JSON
下一篇
C++ 30天屠龍記(第25天): 用Concept限制template類型
系列文
C++ 30天屠龍記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言