Ich verwende das Visitor-Muster, um Reflektion zu implementieren, ohne auf RTTI angewiesen zu sein. Mein Problem ist:Variadic Template-Klasse: Ist es möglich, eine eindeutige Member-Funktion pro variadic Template-Argument zu implementieren?
ich einen Besucher implementieren will, die verschiedenen Klassen werfen kann DerivedItem1, DerivedItem2 usw. aus der gleichen BaseItem Klasse abgeleitet, auf diese BaseItem Klasse.
Die Basisklasse und einer der abgeleiteten Klassen wie folgt aussieht:
class BaseItem : public AbstractItem
{
virtual ~BaseItem(){}
virtual void visit(AbstractVisitor &v)
{
v.handle(*this);
}
}
class DerivedItem1 : public BaseItem
{
virtual ~DerivedItem(){}
virtual void visit(AbstractVisitor &v)
{
v.handle(*this);
}
}
Die Besucherklasse:
class BaseVisitor : public AbstractVisitor
{
virtual ~BaseVisitor(){}
void handle(BaseItem &item)
{
// <-- stuff to do for all classes derived from BaseItem
}
}
Es ist nicht möglich, den BaseVisitor so zu implementieren, seit DerivedItem::visit(BaseVisitor)
wirft sich nicht auf seine Basisklasse und BaseVisitor::handle(BaseItem &v)
wird nie aufgerufen werden.
Ich mag den Besucher als Template-Klasse implementieren, eine Basisklasse und alle abgeleiteten Klassen als Template-Parameter wie dies unter:
template <typename BaseT, typename... DerivedT>
class BaseVisitor : public AbstractVisitor
{
public:
virtual ~BaseVisitor(){}
// unpacking all DerivedT should happen here
// DerivedT_X are the packed template arguments ...DerivedT
void handle(DerivedT_1 &item)
{
// <-- cast item to BaseT, do stuff, return BaseT* to caller
}
void handle(DerivedT_2 &item)
{
// <-- cast item to BaseT, do stuff, return BaseT* to caller
}
};
Ist es möglich, irgendwie mit C++, damit der Compiler dieses Mitglied erzeugen funktioniert für sich alleine?
Sie könnten einen 'std :: tuple' von den variadische Template-Typen nehmen, und [iterieren diese] (http://stackoverflow.com/questions/1198260/iterate -über-tupel). –
IINM, Andrei Alexandrescu hat ein Kapitel genau in [Modernes C++ Design] (https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design). Sehen Sie [diesen Link] (http://www.artima.com/cppsource/cooperative_visitor.html) für etwas Ähnliches. –
@AmiTavory Ah, sehr kreativ. Andrei ist wirklich gut in dieser Art von Template-Metaprogrammierung. –