• [soccerwindow2] boost::signals メモ (akiyama) 10:51:42

Slotの呼出し順序は,FIFO.http://boost.org/doc/html/signals/tutorial.html#id2731552

By default, slots are called in first-in first-out (FIFO) order, so the output of this program will be as expected:

SignalにSignalをconnectすることが可能. 良かった.これでQtとほとんど同じ書き方が出来る.

typedef boost::signal< void (int) > Signal;

class SlotClass {
public:
  void func( int ) { }
};

SlotClass slot_obj;
Signal original_signal;
Signal bridge_signal;

bridge_signal.connect( std::bind1st( std::mem_fun( &SlotClass::func ),
                                               &slot_obj ) );
// boost::bindを使う場合は
//bridge_signal.connect( boost::bind( &SlotClass::func,
//                                              &slot_obj,
//                                               _1 );

original_signal.connect( bridge_signal );

original_signal( 1 );

Slotの関数が引数無しの場合は,boost::bindを使わなければならない.

typedef boost::signal< void () > Signal;

class SlotClass {
public:
  void func() { }
};

SlotClass slot_obj;
Signal signal;
signal.connect( boost::bind( &SlotClass::func,
                                     &slot_obj ) );

signal();

つまり,引数のある無しに関わらず,最初からboost::bindを使う方が書き方が統一されて楽ということ.

コンパイル時間が気になるようだったら,専用のファンクションオブジェクトクラスをインナークラスとして定義すればいいのかな.引数無しSlotの数だけ定義が必要になるから,boost::bindを使う方が間違いなく効率は良いだろうけど.

typedef boost::signal< void () > Signal;

class SlotClass {
public:
  struct Func {
     SlotClass & parent_;
     Func( SlotClass & parent ) : parent_( parent ) { }
     void operator()() { parent_.func(); }
  };
  void func() { }
};

SlotClass slot_obj;
Signal signal;
signal.connect( SlotClass::Func( slot_obj ) );

signal();

えーと,gccって,どのバージョンからboost::bindをサポートしてるんだっけ? http://boost.org/libs/bind/bind.html を読んでも書いてないなぁ. http://boost.org/doc/html/function/tutorial.html によると, boost::signal< void (int) > という書き方は2.95以降で既にサポートされているみたいだから,あまり気にしなくてもいいかな.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-14 (月) 14:51:37 (1308d)
SourceForge.JP
Creative Commons License
RoboCup tools by Hidehisa Akiyama is licensed under a Creative Commons 表示-非営利 2.1 日本 License.