2016-08-01 16 views
0

Lassen Sie uns sagen, dass ich mehrere Containerklassen wie diese haben:Templated Feste + Variable-sized Klasse

template<typename T> class Container 
{ 
    /* ... */ 
}; 

template<typename T, size_t> class Array : public Container<T> 
{ 
    /* Fixed-sized Container */ 
}; 

template<typename T> class Vector : public Container<T> 
{ 
    /* Variable-sized Container */ 
}; 

Und ich habe eine Klasse, die eine von diesen als Template-Parameter akzeptiert:

template<typename T, template<typename> class U, size_t M> class Polygon 
{ 
    U<T> Vertices; // Problem, what if user passes Array (it needs 2 parameters) 
    U<T, M> Vertices; // Problem, what if the user wants to use a variable-sized container (it needs only 1 parameter) 
}; 

Meine Frage ist, kann ich irgendwie (wohl durch knifflige Template-Parameter-Magie) die verbrauchende Klasse dazu bringen, jede Art von Container (fest oder variabel, auch mit unterschiedlichen Template-Signaturen) zu akzeptieren?

Die einzigen Garantien über die Vorlage Signaturen sind, wenn es ein fester Größe Container ist, wird es zwei Parameter haben <Type, Size> und eine, wenn es sich um eine Variable-sized Behälter ist <Type>

Antwort

3

Es ist viel weniger heikel als Sie denken, es ist. Sie können nur Vorlage auf dem Container selbst:

template <class Container> 
class Polygon { 
    Container vertices; 
}; 

Dies funktioniert für alles, das Ihre Container Anforderungen erfüllt, sei es feste Größe oder nicht.

Das Problem der Auswahl der richtigen Vorlagenargumente für den Container wird an den Instanziierungspunkt verschoben, wo die Parameter und Typen trotzdem bekannt sein müssen.