Vous pouvez déclarer une classe basée sur un modèle dont la définition indique les arguments par défaut, mais chaque fois que vous référencez la classe, vous devez inclure tous ses arguments jusqu'à ce que la définition soit introduite.
par exemple. Utilisons std::vector
sans l'inclure (le deuxième argument de std::vector
est défini avec une valeur par défaut):
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;
}
On peut alors l'utiliser sans inclure le vecteur, par exemple:
int main()
{
Foo(3);
}
Et nous pouvons l'utiliser avec std::vector
, par exemple:
#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));
}
Je n'ai pas vérifié les normes, mais cela fonctionne sur clang
/ gcc
avec -std=c++98
jusqu'à -std=c++17
, donc si ce n'est pas officiellement une norme, cela semble être officieusement le cas.