>>361
そもそも C++ なら、タスク用の構造体を用意せずに

struct Task {
  virtual void Update(unsgned tick) = 0;
};

とでもインターフェースを用意してやって、Task を継承したクラスを、自機/弾/敵機
など必要なだけ用意。あとはメインループの中で

using namespace boost;
using namespace std;

list<shared_ptr<Task> > taskList;
for_each(taskList.begin(), taskList.end(), bind(&Task::Update, _1, tick);

とループをまわせば終わりって気がする。

実際には

 taskList への新規タスクの登録/削除のタイミングに関しては気をつける必要が
 あるけど(特に for_each 使う場合には、ループの最中に削除すると iterator が不
 正な値を指すことになる)

 taskList への挿入削除時に動的なメモリ確保/開放処理が発生するので、メモ
 リ不足が発生しては困る環境では allocator を自作するか、list の変わりになる
 コンテナを自前で実装する。

 タスクの新規作成/削除時に動的なメモリ確保/開放処理が入るので、ヒープの
 断片化が気になる場合には Task::new, Task::delete を自前で用意する。

とか細かい注意点があるけど、そんなものでしょ。