C++11の新機能 range based for 、
C#でいうところの foreach ( ほげほげ in ぱよぱよ) でありんす。
幸いなことに VC++11β でも使えます♪
# 残念なことにインテリセンスが赤線引いてくれやがりますけど
オモシロイネー、コレ。
for_each(c.begin(), c.end(), [](int n) { cout << n << endl;});
でももちろんかまわんけども
for ( auto n : c ) { cout << n << endl; }
って書けちゃうんだねー。
lambdaと違ってautoを許すのがナイス♪
コンテナとして許されるのは フツーの配列はもちろん、
array, vector, list ... コンテナはみんなOKだし、
こんなの↓も許す。
map<int,string> c;
for ( auto item : c ) { cout << item.first << ',' << item.second << endl; }
ちょいちょいとあすんでみたところ、begin()/end() を持ってて、
そいつらが ++, *, != できるもんを返せばいいみたいね。
#include <iostream>
using namespace std;
template<typename T>
class iterap {
public:
iterap(T t) : value_(t) {}
iterap(const iterap& other) : value_(other.value_) {}
iterap& operator=(const iterap& other) { value_ = other.value_; }
T operator*() const { return value_; }
iterap& operator++() { ++value_; return *this; }
iterap operator++(int) { return value_++; }
friend bool operator==(const iterap& x, const iterap& y) { return x.value_ == y.value_; }
friend bool operator!=(const iterap& x, const iterap& y) { return !(x == y); }
friend bool operator< (const iterap& x, const iterap& y) { return x.value_ < y.value_; }
friend bool operator>=(const iterap& x, const iterap& y) { return !(x < y); }
friend bool operator> (const iterap& x, const iterap& y) { return y < x; }
friend bool operator<=(const iterap& x, const iterap& y) { return !(y < x); }
private:
T value_;
};
template<typename T>
class iterange {
public:
iterange(T first, T last) : first_(first), last_(last) {}
iterap<T> begin() const { return iterap<T>(first_); }
iterap<T> end() const { return iterap<T>(last_); }
private:
T first_;
T last_;
};
int main() {
for ( auto n : iterange<int>(0,6) ) {
cout << n << ' ';
}
}