Ви можете оголосити шаблонний клас, у визначенні якого вказані аргументи за замовчуванням, але кожного разу, коли ви посилаєтесь на клас, ви повинні включати всі його аргументи, поки не буде введено визначення.
напр. Давайте використовувати, 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>
// 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));
}
Я не перевірив стандарти, але це працює на clang/ gccз -std=c++98до -std=c++17, так що якщо це офіційно не стандарт , то це виглядає так неофіційно.