Có, nó là một tham số không phải kiểu. Bạn có thể có một số loại thông số mẫu
- Nhập Tham số.
- Các loại
- Mẫu (chỉ các lớp và mẫu bí danh, không có hàm hoặc mẫu biến)
- Tham số không phải loại
- Con trỏ
- Người giới thiệu
- Biểu thức hằng số tích phân
Những gì bạn có ở đó là loại cuối cùng. Đó là một hằng số thời gian biên dịch (cái gọi là biểu thức hằng số) và có kiểu số nguyên hoặc kiểu liệt kê. Sau khi tra cứu nó trong tiêu chuẩn, tôi phải chuyển các mẫu lớp lên phần loại - mặc dù các mẫu không phải là loại. Nhưng chúng được gọi là tham số kiểu với mục đích mô tả những kiểu đó. Bạn có thể có con trỏ (và cả con trỏ thành viên) và tham chiếu đến các đối tượng / chức năng có liên kết bên ngoài (những đối tượng có thể được liên kết đến từ các tệp đối tượng khác và có địa chỉ là duy nhất trong toàn bộ chương trình). Ví dụ:
Tham số loại mẫu:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Tham số số nguyên mẫu:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Tham số con trỏ mẫu (chuyển một con trỏ đến một hàm)
template<void (*F)()>
struct FunctionWrapper {
static void call_it() { F(); }
};
// pass address of function do_it as argument.
void do_it() { }
FunctionWrapper<&do_it> test;
Tham số tham chiếu mẫu (chuyển một số nguyên)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Tham số mẫu mẫu.
template<template<typename T> class AllocatePolicy>
struct Pool {
void allocate(size_t n) {
int *p = AllocatePolicy<int>::allocate(n);
}
};
// pass the template "allocator" as argument.
template<typename T>
struct allocator { static T * allocate(size_t n) { return 0; } };
Pool<allocator> test;
Một mẫu không có bất kỳ thông số nào là không thể. Nhưng một mẫu không có bất kỳ đối số rõ ràng nào là có thể - nó có các đối số mặc định:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Về mặt cú pháp, template<>
được dành riêng để đánh dấu một chuyên môn hóa mẫu rõ ràng, thay vì một mẫu không có tham số:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
thay vì của bạnenum
. Vì vậy, cácFactorial<0>
mẫu sẽ cóstatic constexpr int value = 1
, vàtemplate <int N> struct Factorial
có thể cóstatic constexpr int value = N * Factorial<N - 1>::value;