#ifndef TASK_H
#define TASK_H
#include "Pch.h"
#include
#include
#define PRIORITY_MAX 1.0f
template class TASK{
public:
typedef void (T::*T1)();
typedef T* T2;
private:
typedef std::multimap map;
map data;
public:
void SetList(T1 p,float pri);
void DeleteList(T1 p);
void TaskRun(T2 th);
};
template void TASK::SetList(T1 p,float pri)
{
data.insert(std::make_pair(pri, p));
}
template void TASK::DeleteList(T1 p)
{
map::iterator cur = data.begin(), end = data.end();
while (cur != end)
if (cur->second == p)
//cur++だからこのときはまだ現在の値を消して終わったらcurが進む。
data.erase(cur++);
else
++cur;
}
template void TASK::TaskRun(T2 th)
{
// 実行する関数内での登録削除を許可するため、先にコンテナに対する
// 操作を全て済ませておきます。
map::const_iterator cur=data.begin(),end=data.end();
//退避用vector(関数ポインタ型のリスト)
typedef std::vector vector;
//リストの数分のvectorリストを確保
vector heap(data.size());
vector::iterator vcur=heap.begin();
vector::const_iterator vend;
for(;cur!=end;++cur){
*vcur=cur->second;
++vcur;
}
vcur=heap.begin();
vend=heap.end();
//vectorに退避させた関数を実行。
for(;vcur!=vend;++vcur){
(th->*(*vcur))();
}
//STLコンテナなので解放処理とかは必要なし。
}
#endif
最初はSTLを使わずに表現してたので、大分汚かったです。
が、助言を頂いてからはSTLを積極的に使っていってます。
シーケンス制御で悩んでいる方は、タスクシステムを勉強することをお勧めします。
本当にちょっと感動します。
管理が難しいけどね(ぼそっ)