2012-05-25 10 views
7

In C++, se ho un parametro template, come posso specializzare in modo pulito un argomento predefinito? Ad esempio, si consideri il seguente:L'argomento predefinito di un parametro modello può essere specializzato?

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

Cosa succede se voglio Value per impostazione predefinita invece float per la classe Special? C'è un modo per specializzare in effetti la classe Association in modo tale che se la chiave è Special il valore predefinito è invece float?

immagino un modo per farlo sarebbe con tratti:

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; 

C'è un modo più succinta di fare questo che non è così coinvolto e potrebbe mostrare più facilmente che int è il default normale al luogo in cui è definita l'associazione?

+1

credo che ci dovrebbe essere un modo per ottenere ciò che si desidera con gli alias di template ('using'), ma io non ho il tempo di capirlo – sehe

risposta

8

Beh, un non-necessariamente-carina one-liner:

#include <type_traits> 

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