Vâng, đó là một tham số không kiểu. Bạn có thể có một số loại thông số mẫu
- Tham số loại.
- loại
- Templates (chỉ các lớp học và các mẫu bí danh, không có chức năng hoặc các mẫu biến)
- 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
};
Nguồn
2009-01-31 16:49:07
Bạn cũng có thể sử dụng loại 'static constexpr int' thay vì' enum'. Vì vậy, mẫu 'Factorial <0>' sẽ có 'static constexpr int value = 1' và' template struct Factorial' có thể có 'static constexpr int value = N * Factorial :: value;' –
bobobobo