2016-09-30 8 views
1

Ich arbeite an Projekt, das generische Cache für mehrere gespeicherte Klassen benötigt. Meine Basisklasse sieht wie folgt aus:Variadic Template-Klasse - variadic Mitglied Funktion

template<typename ... Types> 
class VarCache{ 
    template<typename T> 
    using item_type = shared_ptr<holder<T>>; 
    template<typename T> 
    using map_type = map<int64_t,item_type <T>>; 
public: 
    std::tuple<map_type<Types>...> caches; 
}; 

Ich brauche Funktion zu schreiben, die keine Argumente akzeptieren würde, sondern indem sie auf Cache-Objekt aufrufen, es würde alle gespeicherten Kartenvarianten iterativ durchqueren, und perfrom Aktion (Entfernen nicht benötigter Elemente) .

Beispiel:

Ich habe VarCache<A,B,C> cache und Verfahren prune<T>(); wo T eine A,B,C ist

und durch cache.prune_all_variants(); Aufruf Ich will Cache

prune<A>(); 
prune<B>(); 
prune<C>(); 

ist dies möglich auszuführen?

Antwort

2

Es gibt ein paar Tricks, mit denen Sie eine Funktion für jedes Element eines Parameterpakets aufrufen können. Hier eine Option ist:

void prune_all_variants() { 
    (void)std::initializer_list<int> { 
     (prune<Types>(), 0)... 
    }; 
} 

In C++ 17, kann dies zu der vereinfacht wird folgende Verwendung fold expressions:

void prune_all_variants() { 
    (prune<Types>(), ...); 
} 
+0

Vielen Dank, funktioniert groß :). – semtexzv

1

Sie verwenden können:

void prune_all_variants() 
{ 
    int dummy[] = {0, (prune<Types>(), void(), 0)...}; 
    static_cast<void>(dummy); // avoid warning for unused variable. 
} 

oder mit Fold Ausdruck in C++ 17:

void prune_all_variants() { 
    (static_cast<void>(prune<Types>()), ...); 
}