目的是定义一个模板容器队列,容器可实例化未(list,vector,deque),容器存储的数据类型(int、string、struct...)也可实例化,本文默认容器为list
模版接口
#pragma once
#include <sysarch.h>
#include <string>
#include <iostream>
#include <list>
//实例化队列数据类型、以及数据类型使用的容器类型(默认list容器)
template <typename T, typename CONT=std::list<T> >
class CQueMgr
{
private:
CONT elems;
TSem m_sem;
public:
CQueMgr();
virtual ~CQueMgr();
bool empty(void) const;
void push(T const &elem);
bool pop(T &elem);
};
template <typename T, typename CONT = std::list<T> >
CQueMgr<T, CONT>::CQueMgr()
{
m_sem = NewSemaphore(1);
}
template <typename T, typename CONT = std::list<T> >
CQueMgr<T, CONT>::~CQueMgr()
{
FreeSemaphore(m_sem);
}
template <typename T, typename CONT = std::list<T> >
bool CQueMgr<T, CONT>::empty(void) const
{
bool fEmpty;
WaitSemaphore(m_sem);
fEmpty = elems.empty();
SignalSemaphore(m_sem);
return fEmpty;
}
template <typename T, typename CONT = std::list<T> >
void CQueMgr<T, CONT>::push(T const &elem)
{
WaitSemaphore(m_sem);
elems.push_back(elem);
SignalSemaphore(m_sem);
}
template <typename T, typename CONT = std::list<T> >
bool CQueMgr<T, CONT>::pop(T &elem)
{
WaitSemaphore(m_sem);
if (!elems.empty())
{
elem = elems.front(); //返回第一个元素
elems.pop_front(); //删除第一个元素
SignalSemaphore(m_sem);
return true;
}
SignalSemaphore(m_sem);
return false;
}
实例化接口
#include <string>
#include <vector>
void main()
{
//默认list容器,实例化数据类型为int
CQueMgr<int> IntQueMgr;
//默认list容器,实例化数据类型为string
CQueMgr<std::string> StringQueMgr;
//使用vector容器,实例化数据类型为string
CQueMgr<std::string, std::vector<std::string> > StringVectorQueMgr;
}