2013-03-01 8 views
5

Rozważ szablon klasy, który implementuje kontener zawierający opcję wyboru miejsca przechowywania.Unikaj powtarzania parametru szablonu w celu uzyskania dostępu do wyliczenia w szablonie klasy.

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

Tutaj został wybrany StorageOption, ponieważ jest używany tylko w klasie.

Teraz instancję klasy bym trzeba powtarzać parametr szablonu, jak:

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

Czy istnieje sposób, aby uniknąć powtarzania parametr i jednocześnie mieć StorageOption będąc członkiem czy istnieje lepszy sposób wdrożenia opcji?

+0

Nie widzę, jak pomysł hmjd mógłby zadziałać. –

+0

Czy próbowałeś tego "using type = Container :: StorageOption"? –

+0

Istnieje brzydkie rozwiązanie, które można wyrzucić z klasy i nazwać je 'ContainerStorageOption'. –

Odpowiedz

7

Osiąga się to zwykle poprzez zdefiniowanie go w klasie bazowej.

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

Dobrze! Zawsze myślę o rzeczach tak małych, jak ten polimorfizm to młotek. Ale myślę, że tak powinno wyglądać C++. – ritter

+0

@Frank, nie ma polimorfizmu, 'ContainerBase' nie jest polimorficzna –

+0

Znów dobrze. To tylko kompozycja. Słuszna uwaga! – ritter

0

I zostały walki z tym problemem sam, a ja nie lubię potrzeby klasy bazowej, a także jak trzeba powtarzać klasę bazową specyfikator gdy chcemy użyć klasy enum. Wymyśliłem to rozwiązanie:

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 {}; 

W ten sposób można mieć globalnie dostępne klasy wyliczeniowe o minimalnej specyfikacji. Nie jest prawdopodobne, że zdarzy się kolizja pomiędzy < pseudonimem klasy> < enum class name>, ale nawet jeśli było, deklaracja użycia powinna cienia (?), Niezależnie od tego, który globalny identyfikator ma się wtrącać (co w szczególnym przypadku może zostać cofnięte ponownie przy użyciu innego użycia). deklaracja).

Powiązane problemy