目的是定義一個模板容器隊列,容器可實例化未(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;
}