Sie können eine Vorlagenklasse deklarieren, deren Definition die Standardargumente angibt. Jedes Mal, wenn Sie auf die Klasse verweisen, müssen Sie jedoch alle Argumente einschließen, bis die Definition eingeführt wird.
z.B. Lassen Sie uns verwenden, std::vector
ohne es einzuschließen (das zweite Argument von std::vector
ist mit einem Standard definiert):
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;
}
Wir können es dann verwenden, ohne den Vektor einzuschließen, z.
int main()
{
Foo(3);
}
Und wir können es verwenden mit std::vector
zB:
#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));
}
Ich habe überprüft nicht die Standards, aber das funktioniert auf clang
/ gcc
mit -std=c++98
bis zu -std=c++17
, so dass , wenn es nicht offiziell ein Standard ist , dann sieht es inoffiziell so sein.