Boost に正式に入るのかどうか知りませんが、Boost.Coroutine というのがあります。
C# で言う yield のようなものですが、ステートマシンに置き換えているわけではなく、内部でコンテキストを切り替えているだけのようです。
で、Boost.Coroutine のサンプルを見てみましたが、超面白そうです。
class range_generator {
public:
typedef int value_type;
range_generator(int min, int max) :
m_current(min),
m_max(max) {}
range_generator() :
m_current(-1),
m_max(0) {}
int operator*() {
return m_current;
}
range_generator& operator++() {
m_current ++;
if(m_current == m_max)
m_current = -1;
return *this;
}
range_generator operator++(int) {
range_generator t(*this);
++*this;
return t;
}
friend
bool operator==(const range_generator& rhs,
const range_generator& lhs) {
return rhs.m_current == lhs.m_current;
}
friend
bool operator!=(const range_generator& rhs,
const range_generator& lhs) {
return !(rhs == lhs);
}
private:
int m_current;
int m_max;
};
range_generator generator(100, 200);
while(generator != range_generator())
std::cout<<*generator++<<"\n";
こんな長いコードが、
int range_generator(generator_type::self& self,
int min,
int max)
{
while(min < max-1)
self.yield(min++);
return min;
}
generator_type generator
(boost::bind
(range_generator,
_1,
100,
200));
while(generator != generator_type())
std::cout<<*generator++<<"\n";
こんな風になります。
イテレータに状態を持つ必要のないことの楽さといったらもう。
この変態ライブラリは機会があれば是非とも使ってみようと思います。