模板技术
C++中一种代码复用技术
1.函数模板
函数模板针对仅参数类型不同的函数,对仅参数不同的函数进行代码复用
基本语法形式
template <typename T> //typename 可以替换成class
T add(T a,T b)
{
return (a+b);
}
2.类模板
类模板针对仅数据成员和成员函数类型不同的类,对仅参数不同的类进行代码复用
基本语法形式
template <typename T> //typename 可以替换成class
class Array
{
private:
T *data;
int len;
int index;
public:
Array(int len=20)
{
data=new T[len];
this->len=len;
this->index=-1;
}
T at(int index)
{
if(index<0 || index > this->index)
{
return -1;
}
return data[index];
}
}
eg:
using namespace std;
#if 1
template <typename T>
class A
{
private:
T val;
public:
A(T x = 0) : val(x) //构造函数
{
}
void set_val(T x) //普通成员函数
{
val = x;
}
void print_val()
{
cout << "val:" << val << endl;
}
A operator+(const A &obj)
{
return A(this->val + obj.val);
}
//通过友元函数 实现运算符重载 方法2
template <typename T2>
friend ostream &operator<<(ostream &out, const A <T2> &obj);
#if 0
//通过友元函数 实现运算符重载 方法1
friend ostream& operator<<(ostream &out, const A &obj)
{
out<<obj.val;
return out;
}
#endif
};
#endif
template <typename T>
ostream &operator<<(ostream &out, const A <T> &obj)
{
out << obj.val;
return out;
}
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
#if 0
template <typename T>
class A //分开写的方法
{
private:
T val;
public:
A(T x = 0 );
void set_val(T x);
void print_val();
};
template <typename T>
A<T>::A(T x ): val(x)
{
}
template <typename T>
void A<T>::set_val(T x)
{
val = x;
}
template <typename T>
void A<T>::print_val()
{
cout << "val:" << val << endl;
}
#endif
int main(void)
{
#if 0
A<int> a1(34);
A<double> a2(6.4);
a1.print_val();
a2.print_val();
#endif
A<int> a1(34);
A<int> a2(84);
A<int> a3 = a1 + a2;
a3.print_val();
cout << a3 << endl; // operator<<(cout,a3)
A<double> a4(33.3);
cout << a4 << endl;
return 0;
}