模板函数笔记
作者:Rem ㅤ | 发布时间:
序言
在写链表的时候想要使用模板函数,在这个过程中却遇到了问题。
在参考书中链表的节点是使用结构体定义的,但是使用结构体就没办法使用模板,只能在代码编写的时候就确定好数据类型,但是这样并不利于代码的普适性,于是我想使用模板类的方法定义节点,同时对类名进行重命名操作,通过重命名可以增强代码的阅读性。第一次尝试重命名+模板函数的操作,过程查阅了一些博客最终才成功实现,在此做一下记录。
节点类
template <class T>
class LNode //单链表节点
{
public:
T data; //数据域
struct LNode *next; //指针域
LNode(T data) : data(data), next(NULL) {} //有参构造
LNode() : next(NULL) {} //无参构造
};
在使用有参数的构造函数时最好显示的创建一个无参数的构造函数,否则在创建无初始值的类变量时会提示找不到对应的构造函数。
重命名
在此使用具有c++特点的using语句进行重命名:
template <class T>
using LNode = LNode<T>; //起别名
template <class T>
using LinkList = LNode<T> *; //起别名
在重命名的时候依然要注明模板。
在此我尝试使用define但是报错:
template <class T>
template <class T>
没有对此细究。
头插法创建带有头指针的链表
template <class T>
LinkList<T> List_HeadInsert(LinkList<T> &head, int n) //带头结点的头插法创建链表,n为数据数量
{
head = new LNode<T>; //头节点
head->next = NULL; //后继节点置空
T data; //数据
for (int i = 0; i < n; i++)
{
cin >> data; //读取输入
LNode<T> *s = new LNode<T>(data); //创建新的节点
s->next = head->next; //插入到头部
head->next = s; //数据
}
return head; //返回头节点
}
函数返回值类型为LinkList<T>,在创建类变量的时候用类型名为LNode<T>.
auto返回
在查看别人的博客的时候发现函数的返回类型可以时auto,对此做了一个简单的测试:
using namespace std;
template <class T>
class Test
{
public:
T a;
};
template <class T>
using t = Test<T>;
template <class T>
auto test(T a, int b)
{
return a;
//return b;
}
int main()
{
Test<int> t;
cout << test<int>(c, 5) << endl;
system("pause");
return 0;
}
在test()函数中返回a或者b都可以成功:

或者:

标签:学习笔记, c/c++