【翁恺】31-模板

why templates?

  • suppose you need a list of X and a list of Y

    • the lists would use similar code
    • they differ by the type shored in the list
  • choices

    • require common base class   方案1
      • may not be desirable
    • clone code   方案2
      • preserves type-safety
      • hard to manage  难以管理维护
    • untyped lists  方案3  没有类型的list
      • type unsafe   不安全

templates  方案4

函数模板(用来做出函数)   类模板   模板函数  模板类

  • reuse source code
    • generic programming
    • use types as parameters in class or function definitions  类型成为参数
  • template functions   
    • example : sort function
  • template classes   
    • example:contains such as stack,list, queue...
      • stack operations are independent of the type of items in the stack
    • template member functions

function templates

  • perform similar operations on different types of data

  • swap function for two int arguments:

    void swap(int& x,int& y){
        int temp = x;
        x = y;
        y = temp;
    }
  • what if we want to swap flats ,strings,Currency,Person?

example:swap function template

template <class T>   // 声明而不是定义
void swap(T& x,T& y){  // 函数模板  T代表一个类型
    T temp = x;
    x = y;
    y = temp;
}
  • the template keyword introduces the template
  • the class T specifies a parameterized type name
    • class means any built-in type or user-defined type
  • inside the template,use T as a type name

function template Syntax

  • parameter types represent:
    • types of arguments to the function
    • return type of the function
    • declare variables within the function

template instantiation

  • generating a declaration from a template class/function and template arguments:
    • types are substituted into template
    • new body of function or class definition is created
      • syntax errors,type checking
    • specialization -- a version of a template for a particular argument(s)

example:using swap

int i = 3;
int j = 4;
swap(i,j);	//use explicit int swap

float k = 4.5;	float m = 3.7;
swap(k,m);	//instanstiate float swap  编译器给制造出来了一个相应函数
std::string s("hello");
std::string t("world");
swap(s,t);	//std::string swap
  • a template function is an instantiation of a function template

interactions  

  • only exact match on types is used

  • no conversion operations are applied

    swap(int, int);	//ok
    swap(double, double);	//ok
    swap(int, double)	//error
  • even implicit conversions are ignored

  • template functions and regular functions coexist

overloading rules

  • check first for unique function match

  • then check for unique function template match

  • then do overloading on functions

    void f(float i,float k)();
    template <class T>
    void f(T t,T u){};
    f(1.0,2.0);
    f(1,2);
    f(1,2.0)

function instantiation

  • the compiler deduces the template type from the actual arguments passed into the function

  • can be explicit:

    • for example,if the parameter is not in the function signature(older compilers won't allow this)

      template <class T>
      void foo(void){...}
      foo<int>();//type T is int
      foo<float>();//tyoe T is float

class templates

  • classes parameterized by types

    • abstract operations form the types being operated upon
    • define potentially infinite set of classes
    • another step towards reuse
  • typical use:container classes

    stack <int>
    //is a stack that is parameterized over int
    list  <Person&>
    queer <Job>

example:Vector

template <class T>
class Vector{
public:
    Vector(int);
    ~Vector();
    Vector(const Vector&);
    Vector& operator=(const Vector&);
    T& operator[] (int);
private:
    T* m_elements;
    int m_size;
};

usage

Vector<int> v1(100);
Vertor<Complex> v2(256);

v1[20] = 10;
v2[20] = v1[20];	//ok if int -> Comlex defined

Vector members

template <class T>  // 每一个都是函数模板
Vector<T>::Vector(int size):m_size(size){
    m_elementds = new T[m_size];
}
template <class T>
T& Vertor<T>::operator[](int indx){
    if(indx < m_size && indx > 0){
        return m_elments[indx];
    }else{
        ...
    }
}

类模板里面的每一个函数都是函数模板

a simple sort function

//bubble sort -- don't use it

template <class T>
void sort(vector<T>& arr){  // 函数模板  声明  
    const size_t last = arr.size()-1;
    for(int i = 0;i < last; i++){
        for(int j = last; i < j; j--){
            if(arr[j] < arr[j-1]){
                //which swap?
                swap(arr[j], arr[j-1]);
            }
        }
    }
}

sorting the vector

vector<int> vi(4);
vi[0] = 4;vi[2] = 7; vi[1]=3; vi[3] = 1;
sort(vi);	//sort(vector<int>&)

vector<string> vs;
vs.push_back("Fred");
vs.push_back("Willma");
vs.push_back("Barney");
vs.push_back("Dino");
vs.push_back("Prince");
sort(vs);	//sort (vector<string>&)
//note:sort uses operator < for comparation

templates

  • templates can use multiple types

    template<class Key,class Value>
    class HashTable{
    	const Value& lookup(const Key&) const;
    	void install(const Key& ,const Value&);
    	...
    };
  • templates nest ---they're just new types!

    Vector< Vector<double*> >	//note sapce > >  空格
  • type arguments can be complicated

    Vector<int (*)(Vector<double>&,int)>//内层是函数

expression parameters

  • template arguments can be constant expressions

  • non-Type parameters

    • can have a default argument
    template <class T, int bounds = 100>
    class FixedVector{
    public:
        FixedVector();
        //...
        T& oprator[](int);
    private:
    	T elements[bounds];//fixed size array
    }

usage:Non-type parameters

  • usage

    FixedVector<int,50> v1;
    FixedVector<int,10*5> v2;
    FixedVector<int> v3;//uses default
  • summary

    • embedding sizes not necessarily
    • can make code faster
    • makes use more complicated
      • size argument appears everywhere
    • can lead to (even more) code bloat

templates and inheritance

  • templates can inherit from non-template classes

    template <class A>
    class Deried:public Base{...}
  • templates can inherit form template classes

    template<class A>
    class Derived : pubic List<A>{...}  
  • non-templates classes can inherit from templates

    class SupervisorGroup:public List<Emoloyee*>

writing templates

  • get a non-template version working first
  • establish a good set of test cases
  • measure performance and tune
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理心炼丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值