Ya, ini adalah parameter non-tipe. Anda dapat memiliki beberapa jenis parameter template
- Jenis Parameter.
- Jenis
- Template (hanya kelas dan template alias, tanpa fungsi atau template variabel)
- Parameter Non-tipe
- Pointer
- Referensi
- Ekspresi konstanta integral
Apa yang Anda miliki di sana adalah jenis yang terakhir. Ini adalah konstanta waktu kompilasi (disebut ekspresi konstan) dan berjenis integer atau enumerasi. Setelah mencarinya di standar, saya harus memindahkan templat kelas ke bagian tipe - meskipun templat bukan tipe. Tetapi mereka disebut tipe-parameter untuk tujuan mendeskripsikan jenis-jenis itu. Anda dapat memiliki pointer (dan juga pointer anggota) dan referensi ke objek / fungsi yang memiliki hubungan eksternal (yang dapat ditautkan dari file objek lain dan yang alamatnya unik di seluruh program). Contoh:
Parameter jenis template:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Parameter bilangan bulat template:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Parameter penunjuk template (meneruskan penunjuk ke suatu fungsi)
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;
Parameter referensi template (meneruskan integer)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Parameter template template.
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 tanpa parameter apa pun tidak dimungkinkan. Tetapi templat tanpa argumen eksplisit apa pun dimungkinkan - itu memiliki argumen default:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Secara sintaksis, template<>
dicadangkan untuk menandai spesialisasi template eksplisit, bukan template tanpa parameter:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
bukan Andaenum
. JadiFactorial<0>
templatnya akan memilikistatic constexpr int value = 1
, dantemplate <int N> struct Factorial
dapat memilikistatic constexpr int value = N * Factorial<N - 1>::value;