タスクの良い点は状態遷移が単純なときに状態変数みたいなものをつくらずに
関数に分けて、特定の状態のときに行う処理がかけることかな。
状態遷移が複雑だったり外部の環境の変化によって遷移の仕方が大きく変わるようなら
Fiberつかったほーがいいけど、適材適所ということで。

キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
正直つくったはいいがザコキャラがでてきてうろうろしたり弾幕があったりするようなゲームを
つくらなかったので使いどころがなかった。

// タスクの管理者はlist<TaskManagable*>をメンバに持ち、Run()を順番に呼んでいくのだ
class TaskManagable {
public:
 virtual void Run() = 0;
};

//タスクになりたいクラスは class MyEntityTickTask : public Task<MyEntityTickTask>
// … とやってMain()を実装する。ChangeTask( hoge ) で自分のメンバ関数 void hoge() へ状態遷移できるよ
//管理者に登録するのはこのMyEntityTickTaskクラスをnewするやつの仕事だ。当然だね(^ー^b
template <typename T> class Task : public TaskManagable {
public:
 Task() { ChangeTask(Main); };
 void Run() { (((T*)this)->*m_doit)(); }
protected:
 virtual void Main() = 0;
 void ChangeTask(void (T::*fp)()) { m_doit = fp; }
 void (T::*m_doit)();
};