Вы можете объявить шаблонный класс, в определении которого указаны аргументы по умолчанию, но каждый раз, когда вы ссылаетесь на класс, вы должны включать все его аргументы, пока не будет введено определение.
например. Давайте использовать, std::vector
не включая его (второй аргумент std::vector
определяется по умолчанию):
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;
}
Затем мы можем использовать его без включения вектора, например:
int main ()
{
Foo(3);
}
... Или мы можем использовать его с std::vector
, например .:
#include <vector>
int main ()
{
Foo(std::vector<int>(3));
}
Я не проверял стандарты, но это работает до clang
/ gcc
с -std=c++98
до -std=c++17
, поэтому, если это не официально стандарт, то это выглядит неофициально.