2013-03-01 10 views
5

Betrachten Sie eine Klassenvorlage, die einen Container implementiert, der eine Option zum Auswählen des Speicherortes enthält.Vermeiden Sie, den Vorlagenparameter für den Zugriff auf enum in der Klassenvorlage zu wiederholen

template<class T> 
class Container { 
public: 
    enum StorageOption {A,B}; 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

Hier StorageOption wurde gewählt, ein Mitglied zu sein, da es nur in der Klasse verwendet wird.

nun die Klasse instanziiert ich brauchen würde, die Template-Parameter zu wiederholen, wie:

{ 
    Container<int> c(Container<int>::A); 
} 

Gibt es eine Möglichkeit, die Parameter zu wiederholen zu vermeiden und zugleich hat StorageOption Mitglied zu sein oder ist es eine bessere Möglichkeit, die Option zu implementieren?

+0

Ich sehe nicht, wie hmjds Idee möglicherweise funktionieren könnte. –

+0

Haben Sie das versucht mit 'using type = Container :: StorageOption'? –

+0

Es gibt eine hässliche Lösung, dass Sie das Enum aus der Klasse entfernen und es ContainerStorageOption nennen könnten. –

Antwort

7

Es wird normalerweise erreicht, indem es in einer Basisklasse definiert wird.

class ContainerBase { 
public: 
    enum StorageOption {A,B}; 
}; 


template<class T> 
class Container : public ContainerBase{ 
public: 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

Container<int> c(ContainerBase::A); 
+0

Richtig! Ich denke immer an etwas so Kleines wie dieser Polymorphismus ein Hammer ist. Aber ich denke, C++ soll so sein. – ritter

+0

@Frank, es gibt keinen Polymorphismus, 'ContainerBase' ist nicht polymorph –

+0

Wieder rechts. Es ist nur Komposition. Guter Punkt! – ritter

0

Ich habe mit diesem Problem selbst zu kämpfen, und ich weiß nicht wirklich wie die Notwendigkeit einer Basisklasse und wie Sie die Basisklassen-Bezeichner wiederholen müssen, wenn Klassen der ENUM nutzen wollen. Ich kam mit dieser Lösung:

Auf diese Weise können Sie global verfügbaren Enum-Klassen mit minimalen Spezifikation haben. Es ist nicht wahrscheinlich, dass eine Kollision zwischen < Klassennickname> < enum Klassenname> auftritt, aber selbst wenn es welche geben sollte, sollte die using-Deklaration jede globale Kennung überschreiben (was in einem speziellen Fall mit einer anderen Instanz wieder rückgängig gemacht werden kann) Erklärung).

Verwandte Themen