目的是定义一个模板容器队列,容器可实例化未(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;
}