2011-10-16 30 views
26

¿Es posible tener parámetro de plantilla opcional en C++, por ejemploparámetro de plantilla Opcional

template < class T, class U, class V> 
class Test { 
}; 

aquí quiero usuario utilizar esta clase, ya sea con V o sin V

Está siguiendo posible

Test<int,int,int> WithAllParameter 
Test<int,int> WithOneMissing 

If Sí, cómo hacerlo.

Respuesta

24

Puede tener predeterminado argumentos de plantilla, que son suficientes para sus propósitos:

template<class T, class U = T, class V = U> 
class Test 
{ }; 

Ahora los siguientes trabajos:

Test<int> a;   // Test<int, int, int> 
Test<double, float> b; // Test<double, float, float> 
27

Sin duda, puede tener parámetros de plantilla por defecto:

template <typename T, typename U, typename V = U> 

template <typename T, typename U = int, typename V = std::vector<U> > 

La librería estándar hace esto todo el tiempo - la mayoría de los contenedores tomar de dos a cinco parámetros! Por ejemplo, es en realidad unordered_map:

template< 
    class Key,      // needed, key type 
    class T,       // needed, mapped type 
    class Hash = std::hash<Key>,  // hash functor, defaults to std::hash<Key> 
    class KeyEqual = std::equal_to<Key>, // comparator, defaults to Key::operator==() 
    class Allocator = std::allocator<std::pair<const Key, T>> // allocator, defaults to std::allocator 
> class unordered_map; 

typicall sólo lo utilizan como std::unordered_map<std::string, double> sin dar ningún pensamiento más.

Cuestiones relacionadas