2011-06-29 24 views
6

Piszę unikatowy generator identyfikatorów, który ma różne strategie generowania identyfikatorów, które są unikalne w ciągu dnia, tygodnia lub miesiąca. Nie chcę tworzyć hierarchii klas z mechanizmem funkcji wirtualnejCzy warto szablonować w oparciu o wyliczenia?

Czy robi się coś takiego jak poniższy fragment kodu, dobry pomysł? Jakieś sugestie?

enum Duration { Day, Week, Month }; 

template <Duration d> 
class IDGenerator 
{ 
    generateId(); 
} 
+1

To zadziała doskonale, odpowiednie klauzule "if" zostaną w tym przypadku całkowicie zoptymalizowane. Zauważ, że nie jest w 100% tak potężny, jak specjalizacja szablonu klasy na typie (chociaż wielu/większość ludzi woli tutaj "mniej mocy"). – Damon

+0

Zdefiniuj "dobry pomysł". –

Odpowiedz

5

Tak to dopuszczalne i będzie działać tylko jeśli plik polimorfizm kompilacji wystarczy, - można zaoszczędzić na połączeniach wirtualnych i który pozwoli na lepsze coptimizations kompilatora.

-1

Jak to powyżej, jest niepotrzebnie mylące. Po prostu utwórz trzy klasy o różnych nazwach.

+0

I dodaj klasę za każdym razem, gdy rozszerza wyliczenie za pomocą, powiedzmy, 'Godziny',' roku' i tak dalej? – aioobe

+0

@Space: Jeśli jest to mylące, po prostu tworzy typedefs jako 'typedef IDGenerator DayIDGenerator' itd. Nie ma potrzeby tworzenia trzech klas o różnych nazwach! – Nawaz

+0

@aioobe: Szablon pomógłby tylko wtedy, gdyby miał sensowną domyślną implementację. To naprawdę zależy od sposobu implementacji 'generateId()'. Może być w stanie ustawić parametr "Czas trwania" jako parametr tej funkcji. –