c++模板

模板一般分函数模板与类模板

函数模板:

解决,不同数据进行同种操作时,可以给数据定义一个模板类型,以达到函数的通用性

基本语法

//模版函数定义

template <typename T> //定义模版类型名T

T test(T x){

return x;

}

test<int>();指定以int型替换T,不指定则系统会参数值自动判断;

计算绝对值函数:

#include <iostream>
using namespace std;
template <typename T>
T abs(T temp)
{
    temp = temp > 0 ? temp : -temp;
    return temp;
}

int main()
{
    int  i = 10;
    double d = -5.5;
    cout << abs<int>(i) << " " << abs<double>(d) << endl;
    return 0;
}

通过函数模板,计算数值的绝对值,就不用重复为不同类型数据定义函数;

类模板

解决同一种类,定义不过数据,或,其成员函数对不同数据作相同处理;

类模板基本语法:

template <class T>

class abs

{

private:

  int i;

  T x;

public:

  abs(T a, T b){}

}

类模板对象的创建:

abs <int> a;

abs <double> b;

使用例:

#include <iostream>
using namespace std;
template <class T>
class Tes
{
  private:
    T i;
    T j;

  public:
    Tes(T x = 0, T y = 0)
    {
        i = x;
        j = y;
    }
    T put()
    {    
        return i * j;
    }
    ~Tes() {}
};
int main()
{
    Tes <int> a(2, 5);
    cout << a.put() <<endl;
    Tes <double> b(2.5, 5.5);
    cout << b.put() <<endl;
    return 0;
}

成员函数外部定义方法:

基本形式:

template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

template<class T> void Tes<T>::add(参数列表){函数体},

#include <iostream>
using namespace std;
//定义模板类
template <class T>
class Tes
{
  private:
    T i;
    T j;

  public:
    Tes(T x = 0, T y = 0)
    {
        i = x;
        j = y;
    }
    T put()
    {    
        return i * j;
    }
    T add();
    ~Tes() {}
};

//外部定义函数方法
template <class T>
T Tes<T>::add()
{
    return i + j;
}
//主函数
int main()
{
    Tes <int> a(2, 5);
    cout << a.put() <<endl;
    cout << a.add() <<endl;
    Tes <double> b(2.5, 5.5);
    cout << b.put() <<endl;
    cout << b.add() <<endl;
    return 0;
}

总结:

在类模板中,只要使用到类名的,后面就要有<>的存在;

结构体模板:(等效于类模板)

template <class T>

struct name

{

  T data;

  name * next;

}

//初始化一个结点

name<int> a;

最后模板的使用体现形式;

//函数模板---使用体现:调用函数时传递的参数类型。
template<class 数据类型参数标识符>
<返回类型><函数名>(参数表)
{
    函数体
}

//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
  struct T data;
  struct StackNode<T> *next;
};

//类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
 public:
  T pop();
  bool push(T e);
 private:
  StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}

 更高阶应用http://en.cppreference.com/w/cpp/language/type_alias

posted @ 2018-02-12 10:14  疯颠研究者  阅读(185)  评论(0编辑  收藏  举报