所涉知识点
阅读此文需要掌握的知识点:回调函数,模板类,类模板,栈。
模板概念
首先模板分为函数模板和类模板
想到模板,就会联想到泛型编程
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
网图:
在之前,我们已经知道了函数重载
还是那一个例子 swap函数交换 int double char
哪怕是函数重载,我们也要写三个,但是如果有了模板,我们只需要:
告诉编译器一个模板,让编译器根据不同的类型利用该模板来生成代码
示例代码
这里直接上代码。
#pragma once #include <stack> using namespace std; typedef void(*printstack)(void *); template<typename t> class reversearray { public: reversearray(); ~reversearray(); void pushstack(t data); t gettopstack(); void popstack(); int getsizestack(); void printstack(void * data, printstack print); private: stack<t> m_stack; }; template<typename t> inline reversearray<t>::reversearray() { } template<typename t> inline reversearray<t>::~reversearray() { } template<typename t> inline void reversearray<t>::pushstack(t data) { m_stack.push(data); } template<typename t> inline t reversearray<t>::gettopstack() { return t(m_stack.top()); } template<typename t> inline void reversearray<t>::popstack() { m_stack.pop(); } template<typename t> inline int reversearray<t>::getsizestack() { return m_stack.size(); } template<typename t> inline void reversearray<t>::printstack(void* data,printstack print) { print(data); }
main.cpp
#include <iostream> #include <string> #include "reversearray.h" using namespace std; #define char_size 5 #define string_size 7 /* 描述:反转数组(任意类型) */ typedef struct person { int age; char name[64]; }person; void myprint(void *data) { person *p = (person*)data; cout << "age;" << p->age << " name:" << p->name << endl; } void printstring(void * data) { string str = *((string*)data); cout << str << endl; } void printchar(void * data) { char c = *((char*)data); cout << c << endl; } void test() { reversearray<person> *pstack = new reversearray<person>; person p1 = { 3,"hudf"}; person p2 = { 5,"akso"}; person p3 = { 7,"及家属的" }; person p4 = { 8,"口袋"}; person p5 = { 8,"husdh"}; pstack->pushstack(p1); pstack->pushstack(p2); pstack->pushstack(p3); pstack->pushstack(p4); pstack->pushstack(p5); while (pstack->getsizestack() > 0) { person data = pstack->gettopstack(); pstack->printstack((void *)&data,myprint); pstack->popstack();//进出栈操作的是栈顶 } cout << "========string array============" << endl; reversearray<string> *pstringstack = new reversearray<string>; string array[] = { "tyu","hello","start","wei","come","waht","world"}; string newarray[string_size]; // cout << array->size() << endl;//这里取第一个字符串中元素的个数 for (size_t i = 0; i < string_size; ++i) { pstringstack->pushstack(array[i]); } cout << "stack size:" << pstringstack->getsizestack() << endl; int i = 0; while (pstringstack->getsizestack() > 0) { string data = pstringstack->gettopstack(); pstringstack->printstack((void *)&data, printstring); newarray[i] = data; pstringstack->popstack();//进出栈操作的是栈顶 ++i; } cout << "=============print newarray============" << endl; for (int i = 0; i < string_size; ++i) { cout << newarray[i]<< " "; } cout << endl; cout << "========char array============" << endl; reversearray<char> *pcharstack = new reversearray<char>; char chararray[] = {'a','b','c','d','e'}; char newchararray[char_size]; for (size_t i = 0; i < char_size; ++i) { pcharstack->pushstack(chararray[i]); } cout << "stack size:" << pcharstack->getsizestack() << endl; int n = 0; while (pcharstack->getsizestack() > 0) { char data = pcharstack->gettopstack(); pcharstack->printstack((void *)&data, printchar); newchararray[n] = data; pcharstack->popstack();//进出栈操作的是栈顶 ++n; } cout << "=============print newchararray============" << endl; for (int i = 0; i < char_size; ++i) { cout << newchararray[i] << " "; } cout << endl; } int main() { test(); return 0; } // 运行程序: ctrl + f5 或调试 >“开始执行(不调试)”菜单 // 调试程序: f5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
开发环境
vs2017控制台输出程序。
运行结果
注意
类模板的使用需要将类的声明与定义放在.h文件中,因为模板本身是一种不确定的类型,编译器在编译的时候需要在.h文件中去找模板中相应的定义。
到此这篇关于c++详解如何通过模板实现元素的反序的文章就介绍到这了,更多相关c++元素的反序内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享C++详解如何通过模板实现元素的反序,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1237635.html