【步兵 c++】 多态&模板 by EOS.
函数模板和类模板,是多态的另一种表现,它赋予了一个函数或者类多种表现。
下面我们直接举例说明吧。
函数模板
template<class T>
inline bool isString(const T& str)
{
string typeName = (typeid(T).name());
if (typeName.find("basic_string") != -1 || typeName.find("char ") != -1)
return true;
return false;
};
//下面代码函数模板中加了一些输出, 输出了下typeName和true false。
测试代码
int main()
{
isString(123);
isString(123.f);
isString(123.0);
isString("123");
string s = "12323";
isString(s);
const char* ss = "123";
isString(ss);
isString("1");
isString('1');
return 0;
}
//输出为:
//int false
//float false
//double false
//char[4] true
//class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> > true
//char const * true
//char[2] true
//char false
上面代码可以看出,通过函数模板,我们只用了一个声明就可以接收任何类型的参数。
和N个强类型函数声明相比,无疑显示出了模板的优势。
可读性更强代码更简洁,不用写连篇的重载,也节约了我们的体力。
注:模板函数声明和实现要写在一起,先声明后实现将会出问题。
接下来写一个模板类的例子
模板类
template<class T>
class Items
{
public:
Items(int size):idx(0), len(size) {
_arr = new T[size];
};
~Items() {
delete[] _arr;
};
void push(const T& v) {
assert(idx != len);
_arr[idx] = v;
++idx;
};
T& pop() {
assert(idx != 0);
--idx;
return _arr[idx];
};
//如果只读模式,返回应为 const T&
T& operator [](int i){
assert(i >= 0 && i < idx);
return _arr[i];
};
private:
T* _arr;
int idx;
int len;
};
//测试代码
int main()
{
Items<int> xx(3);
xx.push(123);
xx.push(321);
xx.push(233);
auto n = xx.pop();
cout << n << endl;
cout << xx[0] << endl;
xx[1] = 666;//如果返回const T&,这里将报错,常量不能作为左值
n = xx.pop();
cout << n << endl;
return 0;
}
//输出为:
//233
//123
//666
这里只是实现了一个简单功能,跟 STL 比起来,九牛一毛了,
但也体现了一种管理的思想,同时也体现出了类模板的特点:极度提高了代码的复用性。
因为他可以是任意类型的(比如我们常用的vector),却只有一个class的定义。
题外话
说实话,类模版很少会用到,主要是因为STL太强大了,基本能满足开发需求。
而函数模版应该值得我们多思考的,当多种数据类型,进行同种操作时,
我们应该第一时间想到函数模版,比如:
我们非常讨厌NULL,因为他经常会让我们的程序崩溃,那么我们就行当一个值是NULL的时候,
我们就去一个有实际意义值来代替他,让我们程序正常运行。
template<class T>
inline T& getDefined(T& a, T& b)
{
return a ? a : b;
};
char* defualt = "c++";
char* p = NULL;
auto x = getDefined(p, defualt);
cout << x << endl;//输出 c++
char* p2 = "c#";
x = getDefined(p2, defualt);
cout << x << endl;//输出 c#
好了,就写这么多。
See Again~
之前
真爱无价,欢迎打赏~