ใช่มันเป็นพารามิเตอร์ที่ไม่ใช่ประเภท คุณสามารถมีพารามิเตอร์เทมเพลตได้หลายประเภท
- พิมพ์พารามิเตอร์
- ประเภท
- เทมเพลต (เฉพาะคลาสและเทมเพลตนามแฝงไม่มีฟังก์ชันหรือเทมเพลตตัวแปร)
- พารามิเตอร์ที่ไม่ใช่ประเภท
- ตัวชี้
- อ้างอิง
- นิพจน์ค่าคงที่อินทิกรัล
สิ่งที่คุณมีคือชนิดสุดท้าย เป็นค่าคงที่เวลาคอมไพล์ (เรียกว่านิพจน์คงที่) และเป็นจำนวนเต็มหรือการแจงนับชนิด หลังจากค้นหาในมาตรฐานแล้วฉันต้องย้ายเทมเพลตคลาสขึ้นไปในส่วนประเภทแม้ว่าเทมเพลตจะไม่ใช่ประเภทก็ตาม แต่จะเรียกว่าพารามิเตอร์ประเภทเพื่อวัตถุประสงค์ในการอธิบายชนิดเหล่านั้นอย่างไรก็ตาม คุณสามารถมีพอยน์เตอร์ (และพอยน์เตอร์สำหรับสมาชิก) และการอ้างอิงอ็อบเจ็กต์ / ฟังก์ชันที่มีการเชื่อมโยงภายนอก (ที่สามารถเชื่อมโยงจากอ็อบเจ็กต์ไฟล์อื่น ๆ และแอดเดรสที่ไม่ซ้ำกันในโปรแกรมทั้งหมด) ตัวอย่าง:
พารามิเตอร์ประเภทเทมเพลต:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
พารามิเตอร์จำนวนเต็มของเทมเพลต:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
พารามิเตอร์ตัวชี้เทมเพลต (ส่งตัวชี้ไปยังฟังก์ชัน)
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;
พารามิเตอร์อ้างอิงเทมเพลต (ผ่านจำนวนเต็ม)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
พารามิเตอร์เทมเพลตเทมเพลต
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;
เทมเพลตที่ไม่มีพารามิเตอร์เป็นไปไม่ได้ แต่เทมเพลตที่ไม่มีอาร์กิวเมนต์ชัดเจนเป็นไปได้ - มีอาร์กิวเมนต์เริ่มต้น:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
ในทางไวยากรณ์template<>
สงวนไว้เพื่อทำเครื่องหมายความเชี่ยวชาญพิเศษของเทมเพลตอย่างชัดเจนแทนที่จะเป็นเทมเพลตที่ไม่มีพารามิเตอร์:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
แทนenum
ไฟล์. ดังนั้นFactorial<0>
แม่แบบจะมีstatic constexpr int value = 1
และtemplate <int N> struct Factorial
สามารถมีได้static constexpr int value = N * Factorial<N - 1>::value;