Bạn có thể khai báo một lớp mẫu có định nghĩa nêu rõ các đối số mặc định, nhưng bất kỳ lúc nào bạn tham chiếu đến lớp, bạn phải bao gồm tất cả các đối số của nó cho đến khi định nghĩa được giới thiệu.
ví dụ. Hãy sử dụng std::vector
mà không bao gồm nó (đối số thứ hai của std::vector
được xác định với một mặc định):
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;
}
Sau đó, chúng tôi có thể sử dụng nó mà không cần bao gồm vectơ, ví dụ:
int main()
{
Foo(3);
}
Và chúng ta có thể sử dụng nó với std::vector
, ví dụ:
#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));
}
Tôi chưa kiểm tra các tiêu chuẩn, nhưng điều này hoạt động trên clang
/ gcc
với -std=c++98
tối đa -std=c++17
, vì vậy nếu nó không phải là tiêu chuẩn chính thức thì có vẻ như không chính thức.