函数模板
由于C++中产生符号是依赖于函数名和参数列表,所以可以使用函数重载。函数重载有很多代码冗余,所以很不方便。假如可以把类型也当作参数传递给函数,就可以减少很多代码的冗余。因此使用函数模板可以精简代码,提高编程效率。
代码不能进行正常编译,说明模板中的语法错误会在生成对应的指令时被编译出来
函数模板的特例化
调用优先级:
普通的函数模板
//普通的函数模板
template<typename T>
bool compare(T a, T b)
{
cout << "template<typename T>bool compare(T a, T b)" << endl;
cout << typeid<T>.name() << endl;
return a > b;
}
if (compare("aaa", "bbb"))
{
cout << "aaa>bbb" << endl;
}
else
{
cout << "bbb>aaa" << endl;
}
如果不实现特例化,以上compare()传入的参数类型是const char*类型,但是比较的就是传入的指针大小,及就是比较地址大小,所以结果不可信,因此需要实现函数模板的特例化
函数模板的特例化:针对于某一个类型通配的函数模板不能进行处理,所以需要写一个特例化的函数模板
//函数模板的特例化
template<>
bool compare(const char* a, const char* b)
{
cout << "bool compare(const char* a, const char* b)" << endl;
return strcmp(a, b) > 0;
}
if (compare("aaa", "bbb"))
{
cout << "aaa>bbb" << endl;
}
else
{
cout << "bbb>aaa" << endl;
}
类模板
template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
Arr()
{
cout << "Arr()" << endl;
}
Arr(const Arr& src)
{
cout << "Arr(const Arr& src)" << endl;
}
Arr& operator=(const Arr& src)
{
cout << "Arr& operator=(const Arr& src)" << endl;
}
~Arr()
{
cout << "~Arr()" << endl;
}
void push_back(const T& val);
void pop_back();
T& back();
T& operator[](int pos);
int size();
private:
T* _arr;
int _len;
int _val_len;
};
类模板成员方法的类外实现
template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
Arr()
{
cout << "Arr()" << endl;
}
Arr(const Arr& src)
{
cout << "Arr(const Arr& src)" << endl;
}
Arr& operator=(const Arr& src)
{
cout << "Arr& operator=(const Arr& src)" << endl;
}
~Arr()
{
cout << "~Arr()" << endl;
}
void push_back(const T& val);
void pop_back();
T& back();
T& operator[](int pos);
int size();
private:
T* _arr;
int _len;
int _val_len;
};
//类模板成员方法的类外实现
template <typename T>
void Arr<T>::push_back(const T& val);
普通模板函数定义为类模板的友元
输出运算符的重载,定义为函数模板。并不是成员方法的类外实现
template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
Arr()
{
cout << "Arr()" << endl;
}
Arr(const Arr& src)
{
cout << "Arr(const Arr& src)" << endl;
}
Arr& operator=(const Arr& src)
{
cout << "Arr& operator=(const Arr& src)" << endl;
}
~Arr()
{
cout << "~Arr()" << endl;
}
void push_back(const T& val);
void pop_back();
T& back();
T& operator[](int pos);
int size();
//友元函数模板
template <typename TT>
friend ostream& operator<<(ostream& out, Arr<TT>& src);
private:
T* _arr;
int _len;
int _val_len;
};
//输出运算符的重载,定义为函数模板。并不是成员方法的类外实现
template <typename T>
ostream& operator<<(ostream& out, Arr<T>& src)
{
for (int i = 0; i < src.size(); i++)
{
out << src[i] << " ";
}
out << endl;
}
类模板的特例化
template <>
class Arr<const char*>
//类模板的特例化
template <>
class Arr<const char*>
{
public:
Arr()
{
cout << "Arr()" << endl;
}
Arr(const Arr& src)
{
cout << "Arr(const Arr& src)" << endl;
}
Arr& operator=(const Arr& src)
{
cout << "Arr& operator=(const Arr& src)" << endl;
}
~Arr()
{
cout << "~Arr()" << endl;
}
void push_back(const const char* val);
void pop_back();
const char* back();
const char* operator[](int pos);
int size();
private:
const char** _arr;
int _len;
int _val_len;
};