melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8241  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

2008年3月28日 #

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";

こんな風になります。

イテレータに状態を持つ必要のないことの楽さといったらもう。


この変態ライブラリは機会があれば是非とも使ってみようと思います。

posted @ 10:09 | Feedback (105)