Usted puede declarar una clase de plantilla cuya definición establece los argumentos por defecto, pero cada vez se hace referencia a la clase debe incluir todos sus argumentos hasta que se introduce la definición.
p.ej. Usemos std::vector
sin incluirlo (el segundo argumento de std::vector
está definido con un valor predeterminado):
namespace std
{
template<typename, typename>
class vector;
}
#include <iostream>
template <typename S, typename T>
void Foo (const std::vector<S,T> & vector)
{
std::cout << "do vector stuff, eg., display size = "
<< vector.size() << std::endl;
}
template <typename T>
void Foo (const T & t)
{
std::cout << "do non-vector stuff..." << std::endl;
}
Luego podemos usarlo sin incluir el vector, por ejemplo:
int main()
{
Foo(3);
}
Y podemos usarlo con std::vector
, por ejemplo:
#include <vector>
// Now the compiler understands how to handle
// std::vector with one argument
// (making use of its default argument)
int main()
{
Foo(std::vector<int>(3));
}
No he comprobado los estándares, pero esto funciona en clang
/ gcc
con -std=c++98
hasta -std=c++17
, por lo que si no es oficialmente un estándar, parece que no lo es oficialmente.