Angenommen, ich ein Objekt, das von anderen Objekten zu beobachten ist:Mit C++ variadischen Vorlagen, wie kann ich eine Gruppe von heterogen typisierten Objekten speichern UND über sie iterieren?
struct Object
{
struct Listener
{
virtual void fire() = 0;
}
Object(std::vector<Listener *> &listeners) :
listeners_(listeners)
{}
void fire()
{
for(auto *l : listeners_)
l->fire();
}
private:
std::vector<Listener *> listeners_;
};
Nun würde ich die gleiche Sache mit Vorlagen zu tun. Hier ist ein Skelett, was ich meine:
template<typename ... Listeners>
struct Object
{
Object(Listeners&&...listeners)
{
// How do I store each of the differently-typed references?
}
void fire()
{
// How do I iterate over the list of listeners?
}
};
Beachten Sie, dass der Schlüssel Sache hier ist, dass ich virtuelle Funktionsaufrufe zu vermeiden, bin versucht. Ich möchte nicht, dass meine Listener (im Template-Code) eine reine virtuelle Klasse oder ähnliches ableiten müssen.
Wäre das nicht jedes Paar 'Object <> 'sehr eng dazu' Hörer'? Sind Sie sicher, dass dies wirklich ein weises Design ist? –
Können Sie ein Beispiel für einen Anwendungsfall geben, um zu demonstrieren, wie Sie das "Objekt" initialisieren und wie das 'fire()' aufgerufen wird? BTW, in Ihrem 'std :: vector' Beispiel sollten Sie' std :: move (listeners) 'oder mindestens' std :: swap() 'benutzt haben. – iammilind
Typ löschen ist dein Freund. – StoryTeller