Tôi tìm thấy this answer bởi Johannes Schaub - litb trên một câu hỏi khác rất hữu ích.
[Tôi đang sao chép dán câu trả lời ở đây, giả sử Johannes không sao với nó.Tôi sẽ xóa hình dán nếu anh ấy không thích nó]
Vâng, đó là thông số không phải loại. Bạn có thể có nhiều loại thông số mẫu
- Tham số loại.
- loại
- Templates (chỉ các lớp học, không có chức năng)
- Non-type Parameters
- Pointers
- Tài liệu tham khảo
- Integral biểu thức hằng số
Những gì bạn có ở đây là loại cuối cùng. Đó là hằng số thời gian biên dịch (được gọi là biểu thức hằng số) và là kiểu số nguyên hoặc kiểu liệt kê. Sau khi tìm kiếm nó trong tiêu chuẩn, tôi đã phải di chuyển các mẫu lớp lên vào phần loại - mặc dù các mẫu không phải là loại. Tuy nhiên, chúng được gọi là kiểu tham số cho mục đích mô tả những loại đó. Bạn có thể có con trỏ (và cũng là con trỏ thành viên) và tham chiếu đến các đối tượng/hàm có liên kết bên ngoài (những liên kết có thể được liên kết từ các tệp đối tượng khác và địa chỉ của nó là duy nhất trong toàn bộ chương trình). Ví dụ:
Template loại tham số:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Mẫu số nguyên tham số:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
tham số con trỏ Template (đi qua một con trỏ tới 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ố mẫu tham khảo (chuyển 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ẫu không có tham số nào là không thể. Tuy nhiên, một mẫu mà không cần bất kỳ lý lẽ rõ ràng là có thể - nó có đối số mặc định:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Cú pháp, template<>
được dành riêng để đánh dấu một mẫu chuyên môn rõ ràng, thay vì một mẫu không có tham số:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG