melt日記

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

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

ニュース

わんくま同盟

わんくま同盟

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

iKnow!


Dictation



書庫

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

こんな風になります。

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


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

投稿日時 : 2008年3月28日 10:09

コメント

# re: [C++]Boost.Coroutine 2008/03/28 10:52 アキラ
ころーたいん?

なるほど。異なるイテレーションのためにイテレータを作らなくていいということですね(で合ってるのかな)

数値の範囲だけならこういう風にできるようにしますけどね
(ちょっと前にmb2syncさんのを参考にして作ったw)
foreach (int i, count_range(100, 200)) {
}

foreach (int i, zero_to(10)) {
}

# re: [C++]Boost.Coroutine 2008/03/28 12:46 melt
>ころーたいん?
コルーチンでっす。
micro thread とか fiber とか呼ばれてるやつです。

関数の途中で凍結させて、もう一度呼び出すとその途中から始められるというやつです。
こうすると、受動的なメソッドを能動的に書くことが出来るようになるので、状態管理が楽になったりすることがあります。

# re: [C++]Boost.Coroutine 2008/03/29 9:40 MB
ころーたいん かわいい 笑
http://p-stade.sourceforge.net/oven/doc/html/oven/ranges.html#oven.ranges.block
こんなのも作りました
もともと作ったのはhamigakiさんですけど

# re: [C++]Boost.Coroutine 2008/03/31 11:47 アキラ
> ころーたいん
マジメに読めませんでした;;

# Тут есть много нужного и интересного 2011/12/25 7:34 PootoLypeflet
главное что бесплатно http://st-tds.com/?pid=5&wkey=40372

# Тут есть много нужного и интересного 2011/12/25 20:43 PootoLypeflet
главное что бесплатно http://st-tds.com/?pid=5&wkey=40372

# best shop 2012/01/18 13:08 dahinnolanask
hifrino.ru for slimming
http://hifrino.ru/ for slimming

Post Feedback

タイトル
名前
Url:
コメント