range-based for

gcc 4.6.1をビルドしたので動作確認。

#include <iostream>
#include <list>
#include <memory>

struct Task{
        int id;
        Task(int id) : id(id){
                std::cout << "Create Task : " << id << std::endl;
        }
        ~Task(){
                std::cout << "Delete Task : " << id << std::endl;
        }
        void update(){
                std::cout << "move Task : " << id << std::endl;
        }
};

int main(){
        std::list<std::unique_ptr<Task>> task_list;

        task_list.emplace_back(new Task(1));
        task_list.emplace_back(new Task(2));
        task_list.emplace_back(new Task(3));
        task_list.emplace_back(new Task(4));
        task_list.emplace_back(new Task(5));
        task_list.emplace_back(new Task(6));

        for(auto it = task_list.begin(); it != task_list.end();){
                if( (*it)->id%2 == 0 ){
                        it = task_list.erase(it);
                        continue;
                }
                it++;
        }
        // range-based for。
        // イテレータではなく中身がそのままitに代入して使われる(ぽい)
        // auto& でほぼ全て大丈夫なんじゃないか疑惑。これはいいものだ。
        for(auto& it : task_list ){
                it->update();
        }
}

実行結果:

Create Task : 1
Create Task : 2
Create Task : 3
Create Task : 4
Create Task : 5
Create Task : 6
Delete Task : 2
Delete Task : 4
Delete Task : 6
move Task : 1
move Task : 3
move Task : 5
Delete Task : 1
Delete Task : 3
Delete Task : 5

やっと……やっとC++にforeachがッ……!