2012-05-25 19 views
7

W języku C++, jeśli mam parametr szablonu, jak mogę wyspecjalizować domyślny argument? Na przykład, należy rozważyć następujące kwestie:Czy argument domyślny parametru szablonu może być wyspecjalizowany?

template <class Key, class Value = int > class Association; 

Co jeśli chcę Value zamiast domyślnie float dla klasy Special? Czy istnieje sposób, aby w efekcie specjalizować klasę Association tak, że jeśli kluczem jest Special, to wartością domyślną będzie float?

sobie wyobrazić jeden sposób, aby to zrobić byłoby z cech:

template <class Key> struct Traits { 
    typedef int defaultValue; 
} 
template<> struct Traits<Special> { 
    typedef float defaultValue; 
} 
template <class Key, class Value = Traits<Key>::defaultValue> class Association; 

Czy jest bardziej zwięzły sposób w ten sposób, że nie jest tak zaangażowany i byłoby łatwiej wykazać, że int jest normalne domyślne przy miejsce, w którym zdefiniowane jest Stowarzyszenie?

+1

Uważam, że powinien być jakiś sposób, aby osiągnąć to, co chcesz z aliasów szablonów ('using'), ale ja nie mam czasu rozwiązać – sehe

Odpowiedz

8

Cóż, nie-koniecznie-ładniejszy jedna wkładka:

#include <type_traits> 

template <typename Key, 
      typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type> 
class Association { /* ... */ }; 
Powiązane problemy