C++中能不能用结构体模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中能不能用结构体模板相关的知识,希望对你有一定的参考价值。

我想做一个链栈,按设想,链栈用类模板实现,在类中使用到结构体指针。但结构体中的类型应该可变。不知道有没有结构体模板,如果有,请各位方家写出来看下。其次,不知道可不可以在结构中再定义一个结构,镶嵌在结构中,并且里面的结构没有预定义。不知道可以不???

当然可以写结构体模版,标准库中的容器都是类(结构体)模版,有vector,list,queue下面是我模仿标准库写的一个Queue(队列),不过其中的接口跟list提供的接口差不多,你只要把所有出现Queue的地方全部换成list就成了,这个程序用到了类模版的很多知识,类模版的前向声明,函数的前向声明,类模版的特化类模版友元函数的设置等等,需要对类模版这块比较熟悉才成
#ifndef QUEUE_H_#define QUEUE_H_#include <iostream>
template<class T> class Queue;
template<class T> std::ostream &operator<<(std::ostream &, const Queue<T> &);
template<class Type> class QueueItem friend class Queue<Type>; friend std::ostream & operator<< <Type>(std::ostream &, const Queue<Type> &); QueueItem(const Type &it): item(it), next(0) Type item; QueueItem *next;;
template<class T>class Queue friend std::ostream & operator<< <T>(std::ostream &, const Queue<T> &);public: Queue(): head(0), tail(0) Queue(const Queue &c); Queue &operator=(const Queue &rhs); template<class Iter> Queue(Iter beg, Iter end): head(0), tail(0) copy_elements(beg, end); ~Queue() destroy(); public: template<class Iter> void assign(Iter beg, Iter end); void push(const T &); void pop(); T &front() return head->item; const T &front() const return head->item; bool empty() const return head == 0; private: QueueItem<T> *head; QueueItem<T> *tail; //utility functions used by copy constructor, assignment and destructor void copy_elements(const Queue &); void destroy();private: template<class Iter> void copy_elements(Iter, Iter);;
template<> voidQueue<const char *>::push(const char *const &s) char *new_item = new char[strlen(s) + 1]; strncpy(new_item, s, strlen(s) + 1); QueueItem<const char *> *p = new QueueItem<const char *>(new_item); if(empty()) head = tail = p; else tail->next = p; tail = p;
template<> void Queue<const char *>::pop() QueueItem<const char *> *p = head; head = head->next; delete []p->item; delete p;
template<class T>void Queue<T>::push(const T &v) QueueItem<T> *p = new QueueItem<T>(v); if(empty()) head = tail = p; else tail->next = p; tail = p;
template<class T> void Queue<T>::pop() QueueItem<T> *p; p = head; head = head->next; delete p;
template<class T>Queue<T>::Queue(const Queue &c): head(0), tail(0) copy_elements(c);
template<class T>void Queue<T>::copy_elements(const Queue &c) for(QueueItem<T> *p = c.head; p; p = p->next) push(p->item);
template<class T> template<class Iter>void Queue<T>::copy_elements(Iter beg, Iter end) for(; beg != end; ++beg) push(*beg);
template<class T> template<class Iter>void Queue<T>::assign(Iter beg, Iter end) destroy(); copy_elements(beg, end);
template<class T> void Queue<T>::destroy() while(!empty()) pop();
template<class T>Queue<T> &Queue<T>::operator=(const Queue &rhs) destroy(); copy_elements(rhs); return *this;
template<class T> inline std::ostream &operator<<(std::ostream &os, const Queue<T> &q) if(q.empty()) return os; QueueItem<T> *p; os << "< "; for(p = q.head; p; p = p->next) os << p->item << " "; os << ">"; return os;
template<> inline std::ostream &operator<<(std::ostream &os, const Queue<const char *> &q) if(q.empty()) return os; QueueItem<const char *> *p; os << "< "; for(p = q.head; p!= q.tail; p = p->next) os << "\"" << p->item << "\"" << ", "; os << "\"" << p->item << "\"" << " >"; return os;
#endif
参考技术A

注意只有在定义结构体时那个模板名不需要加模板参数列表<T>,之后应用该模板都应该加<T>

如这里的node<T>

#include <iostream>

#include <stdlib.h>

using namespace std;

template <class T>

struct node

T data;

node<T>* next;

;

template <class T>

node<T>* CreateList(int len, T a[])

node<T>* head = new node<T>;

node<T>* tmp = head;

for (int i = 0; i < len; i++)

tmp->data = a[i];

if (i == len - 1)

tmp->next = NULL;

continue;

node<T> * newNode = new node<T>;

tmp->next = newNode;

tmp = newNode;

return head;

template <class T>

void Show(node<T>* head)

for (node<T> * tmp = head; tmp!= NULL; tmp = tmp->next)

cout << tmp->data << " ";

cout << endl;

int main()

int a[3] = 1,2,3;

node<int>* head = CreateList(3, a);

Show(head);

return 0;

参考技术B 我觉得可以这样:

template <typename T>
struct Node

T data;
Node* next;
;

C++ SOCKET发送结构体及接收

结构体如下
typedef struct user
char name[10];
int age;
bool sex;
user;
赋值如下
user student
strcpy(student.name,"小明");
student.age=14;
student.sex=TRUE;
我要做什么后才能
还有就是服务器发送是WSASend
客户端接收是WSARecv
如果是转存到BYTe数组里,应该怎么做呀,请大侠们贴一下具体的代码,光说我不知道怎么写呀,我菜鸟呀,谢谢了!
没人知道的吗

参考技术A //方法很多,下边举个例子吧。还可以用union联合进行数据类型的转换,功能更加强大。你这种情况,就按照下边处理吧。
user student
strcpy(student.name,"小明");
student.age=14;
student.sex=TRUE;

buffer = (BYTE*)malloc(sizeof(user));
BYTE *p;
p = (BYTE*)(&student);
for(int i = 0; i<sizeof(user); i++)

buffer[i] = p[i];

buffer[i] = 0;本回答被提问者采纳

以上是关于C++中能不能用结构体模板的主要内容,如果未能解决你的问题,请参考以下文章

C++ 模板结构体

动态链接库中能导出结构体吗

c++模板类的知识,为啥下面程序要用结构体,把T data写在类里面不可以吗?看到好多地方这样写

C++中为何不能对共用体变量名赋值?

C++ 介绍——自定义数据类型

C++结构体指针数组如何分配空间,用new