Você pode declarar uma classe modelada cuja definição declara os argumentos padrão, mas sempre que fizer referência à classe, deverá incluir todos os seus argumentos até que a definição seja introduzida.
por exemplo. Vamos usar std::vector
sem incluí-lo (o segundo argumento de std::vector
é definido com um padrão):
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;
}
Podemos então usá-lo sem incluir o vetor, por exemplo:
int main()
{
Foo(3);
}
E podemos usá-lo com std::vector
, por exemplo:
#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));
}
Não verifiquei os padrões, mas isso funciona em clang
/ gcc
com -std=c++98
até -std=c++17
, então, se não for oficialmente um padrão, parece que não é oficial.