2012-05-25 18 views
7

En C++, si tengo un parámetro de plantilla, ¿cómo puedo especializar limpiamente un argumento predeterminado? Por ejemplo, considere lo siguiente:¿Se puede especializar el argumento predeterminado de un parámetro de plantilla?

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

Qué pasa si quiero Value a por defecto en lugar de float para la clase Special? ¿Hay alguna manera de especializar de hecho la clase Association de modo que si la clave es Special, el Valor predeterminado es en cambio float?

me imagino una forma de hacerlo sería con rasgos:

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; 

¿Existe una manera más sucinta de hacer esto que no es tan involucrados y que más fácilmente muestran que int es el valor predeterminado normal en el lugar donde se define Asociación?

+1

Creo que debe haber una manera de lograr lo que quiere con los alias de plantilla ('using') pero no tiene tiempo para descárgalo – sehe

Respuesta

8

Bueno, un no-necesariamente-más bonita de una sola línea:

#include <type_traits> 

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