2013-03-01 20 views
5

Prendere in considerazione un modello di classe che implementa un contenitore che include un'opzione per la scelta del relativo spazio di archiviazione.Evitare di ripetere il parametro del modello per accedere a enum nel modello di classe

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

Qui StorageOption stato scelto per essere un membro dal momento che viene utilizzato solo in classe.

Ora, creare un'istanza della classe avrei bisogno di ripetere il parametro di template, come:

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

C'è un modo per evitare di ripetere il parametro e allo stesso tempo avere StorageOption essere un membro o c'è un modo migliore per implementare l'opzione?

+0

Non vedo come l'idea di hmjd possa funzionare. –

+0

Hai provato questo 'usando type = Container :: StorageOption'? –

+0

C'è una brutta soluzione che si potrebbe mettere l'enum fuori dalla classe e chiamarlo 'ContainerStorageOption'. –

risposta

7

Solitamente si ottiene definendolo in una classe base.

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

Giusto! Sto sempre pensando a qualcosa di così piccolo come questo polimorfismo è un martello. Ma immagino che sia così che C++ deve essere. – ritter

+0

@Frank, non c'è polimorfismo, 'ContainerBase' non è polimorfo –

+0

Ancora ragione. È solo composizione. Buon punto! – ritter

0

sono stato in lotta con questo problema me stesso e non ho davvero come la necessità di una classe base e come è necessario ripetere la classe identificatore di base quando si vuole utilizzare le classi enum. Sono venuto con questa soluzione:

namespace FuncEnum{ 
    enum class FuncNeighbor{ 
     FLOOR, CEILING, SELF 
    }; 
    enum class FuncDirection{ 
     BACK, FRONT, BACKNFRONT 
    }; 
    enum class FuncVar{ 
     X, Y 
    }; 
} using namespace FuncEnum; 

template<typename... Types> 
class Func {}; 

In questo modo è possibile avere Enumera classi disponibili a livello globale con la specifica minima. Non è probabile che si verifichi una collisione tra il soprannome della classe <> < nome della classe enum> ma anche se ci fosse, la dichiarazione using dovrebbe shadow (?) Qualunque identificatore globale che sta per interferire (che, in un caso particolare, può essere annullato di nuovo con un altro usando dichiarazione).

Problemi correlati