Aşağıdaki kod, talep ettiğiniz şeylerin en az çalışan bir örneğidir. ClassA
iki sinyal yayar; SigA
parametresi göndermez (ve kabul etmez), SigB
bir int
gönderir. ClassB
, her bir işlev çağrıldığında cout
'a çıkacak iki işlevi vardır. Örnekte, ClassA
(a
) ve iki adet ClassB
(b
ve b2
) örneği bulunmaktadır. main
, sinyalleri bağlamak ve ateşlemek için kullanılır. ClassA
ve ClassB
'un birbirlerinden hiçbir şey bilmediğine dikkat etmek gerekir (yani derleme zamanı bağlı değil).
#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>
using namespace boost;
using namespace std;
struct ClassA
{
signal<void()> SigA;
signal<void (int)> SigB;
};
struct ClassB
{
void PrintFoo() { cout << "Foo" << endl; }
void PrintInt(int i) { cout << "Bar: " << i << endl; }
};
int main()
{
ClassA a;
ClassB b, b2;
a.SigA.connect(bind(&ClassB::PrintFoo, &b));
a.SigB.connect(bind(&ClassB::PrintInt, &b, _1));
a.SigB.connect(bind(&ClassB::PrintInt, &b2, _1));
a.SigA();
a.SigB(4);
}
çıkışı: Ben normalde üretim kodunda kullanmak ister bazı kısayollar geçtiniz kısalık için
Foo
Bar: 4
Bar: 4
(özellikle erişim kontrolü gevşek ve şimdi etsen normalde 'gizle' sinyal kaydı, KeithB'nin örneğinde olduğu gibi bir fonksiyonun arkasına kaydedilir).
boost::signal
'daki zorluğun çoğu boost::bind
'u kullanmaya alışkın görünüyor.Bu ilk başta biraz zihin bükme olduğunu! yardımcı olur
a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));
Hope: does değil bir int
yayarlar ClassB::PrintInt
bile SigA
olsa yanıltıcıdır Örneğin ayrıca ClassA::SigA
kanca bind
kullanabilirsiniz!
Bir işlevi aşırı yüklemek mümkün mü ve eğer öyleyse, bunu ekleyebilir misiniz? s.t. PrintNum (int) gibi bir şey var; ve PrintNum (şamandıra); – pyInTheSky
@pyInTheSky Bir işlev türü kullanın (tam terimden emin değil): '(void (*) (int)) & PrintNum' – Qix