Boost.Signals: クラステンプレート signalN N はサポートされているシグナルのパラメタ数である。
つまり、
ヘッダ <boost/signals/signal0.hpp> には signal0 が含まれており、
ヘッダ <boost/signals/signal1.hpp> には signal1 が含まれている。
サポートされているシグナルの最大パラメタ数は実装定義だが、
最低 10 であることが要求される。
#include <boost/signals/signalN.hpp>
本ドキュメントは複数の関係するクラス signal0,
signal1, signal2 などを扱う。
ここで末尾の数値は、シグナルとそれに接続されたスロットがとるパラメタ数を表す。
すべてのクラスを列挙する代わりに、
単一の例 signalN について記述する。
なお N は関数のパラメタ数を表す。
namespace boost {
template<typename R,
typename T1,
typename T2,
...
typename TN,
typename Combiner = last_value<R>,
typename Group = int,
typename GroupCompare = std::less<Group>,
typename SlotFunction = boost::functionN<R, T1, T2, ..., TN> >
class signalN :
boost::noncopyable, // 開示用 : クラスは Noncopyable 要求を満たす
boost::trackable
{
public:
typedef typename Combiner::result_type result_type;
typedef Combiner combiner_type;
typedef Group group_type;
typedef GroupCompare group_compare_type;
typedef SlotFunction slot_function_type;
typedef slot<slot_function_type> slot_type;
typedef implementation-defined slot_result_type; SlotFunction が戻り値型 void を持つ場合は void でない可能性がある; そのほかの場合には SlotFunction の戻り値型
typedef implementation-defined slot_call_iterator; // value_type が R である InputIterator
typedef T1 argument_type; // N == 1 のとき、シグナルは AdaptableUnaryFunction のモデルである
typedef T1 first_argument_type; // N == 2 のとき、シグナルは AdaptableBinaryFunction のモデルである
typedef T2 second_argument_type; // N == 2 のとき、シグナルは AdaptableBinaryFunction のモデルである
typedef T1 arg1_type;
typedef T2 arg2_type;
.
.
.
typedef TN argN_type;
explicit signalN(const combiner_type& = combiner_type(), const group_compare_type& = group_compare_type());
~signal();
signals::connection connect(const slot_type&);
signals::connection connect(const group_type&, const slot_type& slot);
void disconnect(const group_type&);
void disconnect_all_slots();
bool empty() const;
result_type operator()(T1 a1, T2 a2, ..., TN aN);
result_type operator()(T1 a1, T2 a2, ..., TN aN) const;
private:
combiner_type combiner; // 開示用
};
}
Combiner はイテレータのシーケンス [first, last) を受け取り、
シーケンス中のいくつかのイテレータを参照外しして値を戻す関数オブジェクトである。
Combiner に渡されるイテレータの型は slot call iterator である。
Group は、接続をグループ化するために用いる型を定義する。これは DefaultConstructible かつ CopyConstructible でなければならない。
GroupCompare は、実引数型が group type と一致する BinaryPredicate である。
これは接続グループの順序関係を定める。
SlotFunction は、
他の互換性がある関数オブジェクトからコンストラクト可能な関数オブジェクトアダプタであることが要求される
(互換性は SlotFunction それ自身によって定義される)。
SlotFunction は T1, T2, .. TN 型のパラメタを受け取り、
シグナルのテンプレートパラメタ型 R に変換可能な結果を返す必要がある;
ただし R が void である場合には SlotFunction の戻り値型はすべて無視されることに注意。
他のシグナルへの接続、ならびに関数オブジェクトの参照への接続では、
SlotFunction は reference_wrapper オブジェクトを受理可能である必要がある。
slot_result_type 型 SlotFunction が void を戻す場合、
スロットの戻り値型は実装定義である; そうでないばあいにはスロットの戻り値型は SlotFunction 関数オブジェクトによって戻される型であることが要求される。
slot_call_iterator 型 value_type が R であるような InputIterator。
slot_call_iterator の参照外し演算子は、
指定された実引数を与えてスロットを呼び出し、その結果を戻す責任を負う。
イテレータを複数回参照外ししたときでもスロットが一度だけ呼び出されることを保証するため、
結果はキャッシュされなければならない。
explicit signalN(const combiner_type& = combiner_type(), const group_compare_type& = group_compare_type());
this->empty();signals::connection connect(const slot_type& slot);
this を slot に接続する。
スロットが 非アクティブ である場合、
たとえばスロット呼び出しに結合された trackable オブジェクトが破棄されている場合、
connect 呼び出しは無視される。signals::connection オブジェクト;
slot が非アクティブである場合、切断状態の接続が返る。signals::connection connect(const group_type& group, const slot_type& slot);
connect(slot) と同様に) シグナルに接続し、
このスロット接続を与えられたグループ group に関連づける。signals::connection オブジェクト。void disconnect(const group_type& group);
group に含まれるスロット数である。this->empty().true、そうでなければ false。
result_type operator()(T1 a1, T2 a2, ..., TN aN); result_type operator()(T1 a1, T2 a2, ..., TN aN) const;
slot_call_iterator の範囲 [first, last) を与えて統合子を呼び出す (言い換えると combiner(first, last))。この範囲は、各スロットに与えられたパラメタの集合 a1, a2, ..., aN を渡して呼び出した結果をイテレートする。スロットはグループ比較関数オブジェクトによって与えられる半順序関係にしたがって呼び出されるが、グループに所属しないスロットは最後に呼ばれる。
const 版の関数呼び出し演算子は統合子を const として実行する一方で、非const 版は統合子を非 const として実行する。
同一グループ中のメンバー、ならびにグループに所属していないスロット間の順序は不定である。
使用される統合子によっては、
スロットが一つもシグナルに接続されていない状態で関数呼び出し演算子を呼び出すと未定義動作を引き起こす可能性がある。
既定の統合子は、
戻り値型が void の場合にはゼロ個のスロットに対しても正しく定義されているが、
戻り値型が他の型の場合には未定義である (なぜなら戻り値を合成する方法がないから)。