Ви можете оголосити шаблонний клас, у визначенні якого вказані аргументи за замовчуванням, але кожного разу, коли ви посилаєтесь на клас, ви повинні включати всі його аргументи, поки не буде введено визначення.
напр. Давайте використовувати, 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
, так що якщо це офіційно не стандарт , то це виглядає так неофіційно.