constなcoroutine
boost::functionと違って、boost::coroutines::shared_coroutineはoperator()が非constになっています。
コルーチンは明らかに状態を持っていて、operator()はその状態を変更するわけなので、直感的には正しく思えます。
しかし、shared_coroutineの名前の通り、コルーチンの状態はshared_coroutineのコピー間で共有されていて、通常の状態を持ったファンクタとは意味合いが違います。
そもそも、operator()が非constであったとしても、
namespace coro = boost::coroutines; typedef coro::shared_coroutine<void()> coro_type; void call_const_coro(const coro_type& coro) { // これは不可 // coro(); coro_type tmp(coro); tmp(); // でもこれは可 }
となって、結局constなコルーチンを呼び出せてしまいます。
そういうわけで、Hamigaki.Coroutineのshared_coroutineはoperator()をconstに変更しました。
手抜き実装につき、状態を共有しないhamigaki::coroutines::coroutineまでconstになっています。
まぁ、いいか。