ich hab da gleich mal ein paar Anerkungen für dich
a) Event.cpp/.hpp:
Code: Alles auswählen
//******************************************************************************
//* Implementierung: Event *
//******************************************************************************
template<class eventResult, class eventParam>
eventResult Event<eventResult, eventParam>::operator() (eventParam)
{
syslog (LOG_INFO, "Event<eventResult, eventParam>::operator () ()");
}
export wäre von nöten, wenn du Template Vorlagen welche Projektweit via Header eingebunden werden.
Praktisch alle template Header machen erst die Klassendefinition und anschliessend die Implementierung .. im Header.
Wenn du das Template nur in dieser Übersetzungseinheit benötigst, kann man das aber so machen.
[1] http://en.wikipedia.org/wiki/C%2B%2B0x# ... deprecated
b) Event.cpp Zeile 87: Das typename ist überflüssig
c) Wenn du das typedef in abhängigkeit vom Event machen willst, muss der Event ein Typ sein. Das würde aber wieder bedeuten, dass Xml ein Template werden muss. Das würde bedeuten, dass jeder Event seine eigene XML Implementierung hat. (vermutlich nicht so von dir gewünscht)
ODER:
Du leitest alle Events von einer Basisklasse ab, welche dein Interface implementieren. Wie weiter vorn im Thread beschrieben. Vor einem oder zwei Jahren hatte ich ein ähnliches Problem welches ich auch unbedingt mit templates lösen zu müssen meinte, dabei war Vererbung mit abstrakter Basisklasse die Lösung.
Du hast sowie ich das sehe folgende Anforderungen an das Design:
- Du willst zu einer string id einen speziellen Event auslösen.
- string id und Event sollen über eine map verknüpft werden.
- alle Events haben das gleiche Interface, aber unterschiedliche Implementierungen.
- alle Events sollen in einen Container eingehängt werden.
Unterschiedliche Typen in einen Container packen, geht in C++ nur über Basisklassen (oder unter Umständen über boost::tuple. hab damit noch nichts gemacht). Tuples deuten aber sehr oft auf eine "Notlösung" hin.
Um wieder auf die spezifischen Typen zugreifen zu können wird dann ein Visitor (double dispatch) eingesetzt.
Gruß
schorsch