2016-04-16 18 views
14

Bu, cevabına sahip bir sorusu olup, amacı okuyuculara kendi çözümlerini önermeye davet etmektir.
Benimkinden daha akıllıca yaklaşımlar olduğundan eminim, bu yüzden bu çözümlerin ne olduğunu bilmek isterim.
Lütfen, kendi cevaplarınızı ekleyerek bilginizi paylaşın !!
Olay verici ve dinleyici olarak üye yöntemlerinin otomatik kayıtları


hedefin birkaç olaylarını gönderecek kullanılabilecek bir yayıcı sınıfı yaratmaktır.

Yayıcıda bulunmak istediğim önemli bir özellik, dinleyicileri yayıcıya bağlamak için kayıt tesisinin kullanımı kolay bir .

Diğer bir deyişle, tüm dinleyicileri yayıcıya takmayı amaçlayan işlevler/yöntemler yazmak istemiyorum, çünkü hataya eğilimli olabilir ve kendimi bir kereden fazla bir Bu nedenle kod satırını kaçırdı (tabii ki N-th dinleyiciyi kaydettirecek bir satır).

aradığım kayıt tesis Aşağıdaki kod satırlarını yeterli olduğu için böyle bir çözüm
struct E1 { }; 

struct S { 
    void receive(const E1 &ev) { /* do something */ } 
}; 

:

aşağıdaki yapılar düşünün

S s; 
emitter.reg(s); 

Ve hatta, hepsi bu Gelecekte,

struct E1 { }; 
struct E2 { }; 

struct S { 
    void receive(const E1 &ev) { /* do something */ } 
    void receive(const E2 &ev) { /* do something */ } 
}; 
yapısına S yapısına bir tane daha dinleyici eklenmesinin gerekliliği ortaya çıkar.

Böyle bir yayıcıyı nasıl yazabilirim?

+1

Er .. emitter.reg (ler) 'in aslında ne yapmak istiyorsun? Ve ne 'emitter' nedir? Bir sınıf şablonunun örneği mi? E1', E2', ... türlerini önceden biliyor musunuz? – Barry

+0

Az ya da çok. Emitter gibi bir tanıma sahip olmak istiyorsam onları tanımalıyım. Sınıf şablonu Belki, gerçek uygulamaya bağlıdır, bu bir cevap olarak önerdiğim şeydir. – skypjack

+0

Çok benzer bir sorunu ele alan küçük bir kitaplık yazdım. Tldr, abone türü üzerinde tip silme kullanmak ve std :: type_index tarafından silinen aboneleri indekslemektir. Lib, https://github.com/mmcshane/eventbus'tur. Kendi kendini tanıtmanın ortaya çıkmasını önlemek için bir cevap yerine yorum olarak gönderiyorum. – mpm

cevap

İlgili konular