C++关于模板
来源:互联网 发布:网络兼职能信吗 编辑:程序博客网 时间:2024/05/29 16:53
假设现在要实现一个比较两个数是否相等的重载函数。
1、两个int类型的操作数比较
bool IsEqual (int left, int right)
{
return left == right;
}
2、两个string类型的操作数比较
bool IsEqual (const string& left , const string& right)
{
return left == right;
}
void test1 ()
{
string s1 ("s1"), s2("s2");
cout<<IsEqual (s1, s2)<<endl;
cout<<IsEqual (1,1)<<endl;
}
...
如果还要比较int/char等等类型就都要分别实现一下,相似的代码重复度非常高。所以我们就要用到模板这一概念。
概念
模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。
模板函数
函数模板格式:
template <class 形参名1, class 形参名2, class 形参名n>
返回类型 函数名(参数列表)
{...}
模板形参的定义既可以使用class,也可以使用typename,含义是相同的。
模板函数登场,定义一个就搞定了。
template<typename T>
bool IsEqual(const T& left, const T& right)
{
return left == right;
}
void test1()
{
string s1("s1" ), s2("s2");
cout << IsEqual(s1, s2) << endl; //此处会将上面的T类型替换为string类型
cout << IsEqual(1, 1) << endl; //此处会将上面的T类型替换为int类型
}
模板参数匹配及显示实例化
template <typename T>
bool IsEqual (const T& left , const T& right )
{
return left == right;
}
void test1 ()
{
cout<<IsEqual (1,1)<<endl;
//cout<<IsEqual(1,1.2)<<endl; // 模板参数不匹配
cout<<IsEqual<int>(1,1.2)<< endl; // 显示实例化
cout<<IsEqual<double>(1,1.2)<< endl; // 显示实例化
}
重载函数模板
bool IsEqual (const int& left , const int& right)
{
return left == right;
}
template <typename T>
bool IsEqual (const T& left , const T& right )
{
return left == right;
}
template <typename T1, typename T2>
bool IsEqual (const T1& left , const T2& right)
{
return left == right;
}
void test1 ()
{
cout<<IsEqual(1,1)<<endl;
cout<<IsEqual<int>(1,1)<< endl;
cout<<IsEqual(1,1.2)<<endl;
}
模板类
普通类顺序表的定义
typedef int DataType;
//typedef char DataType;
class SeqList
{
private :
DataType* _data ;
int _size ;
int _capacity ;
};
template<typename T>
class SeqList
{
private :
T* _data ;
int _size ;
int _capacity ;
};
类模板的格式
template<class 形参名1, class 形参名2, ...class 形参名n>
class 类名
{ ... };
模板类
// 动态顺序表
template<typename T>
class SeqList
{
public :
SeqList();
~ SeqList();
private :
int _size ;
int _capacity ;
T* _data ;
};
template <typename T>
SeqList <T>:: SeqList()
: _size(0)
, _capacity(10)
, _data(new T[ _capacity])
{}
template <typename T>
SeqList <T>::~ SeqList()
{
delete [] _data ;
}
void test1 ()
{
SeqList<int > sl1;
SeqList<double > sl2;
}
模板总结
优点:
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。
增强了代码的灵活性。
缺点:
模板让代码变得凌乱复杂,不易维护,编译代码时间变长。
出现模板编译错误时,错误信息非常凌乱,不易定位错误。
模板还有一些高深晦涩的玩法,在实际运中的大多数的场景下上面的特性已经够我们玩了,所以不用去纠结模板的复杂莫测的玩法。真有兴趣深入学习的童鞋,或者有要用到一些复杂特性时,可以通过《C++ Templates 中文版》学习。
本文出自 “10911544” 博客,请务必保留此出处http://10921544.blog.51cto.com/10911544/1763914
- [C++]queue简单实现--关于模板
- 关于模板--模板函数
- 关于C++STL模板库的一些总结(一)
- 关于模板
- 关于模板
- 关于 模板
- C++-模板
- C++-模板
- C++:模板
- C++:模板
- C++:模板
- 模板 (C++)
- C ++ 模板
- C ++ 模板
- 【C++】模板
- c++----------模板
- C++--------------------------------------------模板
- c++--模板
- oracle表重命名
- 单链表常见面试题
- C++的特性——继承
- Oracle常用函数:nvl/nullif/case when/wm_concat/replace
- iOS图像处理之Core Image ------ 吴白
- C++关于模板
- 用两个栈实现一个队列
- 二叉树常考面试题
- 定时刷新extjs的grid某一列的数据
- caffe中在proto文件里定义网络各层结构
- 用dd命令生成bin文件,而不用拆flash读取文件
- 字符串
- Leetcode 39 Combination Sum & 40 Combination Sum II & 216 Combination Sum III & 377 Combination V
- Unity中HideInInspector和SerializeField一起使用