Ja, es handelt sich um einen Parameter ohne Typ. Sie können verschiedene Arten von Vorlagenparametern verwenden
- Geben Sie Parameter ein.
- Typen
- Vorlagen (nur Klassen- und Aliasvorlagen, keine Funktionen oder Variablenvorlagen)
- Nicht typisierte Parameter
- Zeiger
- Verweise
- Integrale konstante Ausdrücke
Was Sie dort haben, ist von letzter Art. Es ist eine Kompilierungszeitkonstante (sogenannter konstanter Ausdruck) und vom Typ Integer oder Enumeration. Nachdem ich es im Standard nachgeschlagen hatte, musste ich Klassenvorlagen in den Abschnitt Typen verschieben - obwohl Vorlagen keine Typen sind. Sie werden jedoch als Typparameter bezeichnet, um diese Arten dennoch zu beschreiben. Sie können Zeiger (und auch Elementzeiger) und Verweise auf Objekte / Funktionen haben, die eine externe Verknüpfung haben (solche, mit denen aus anderen Objektdateien verknüpft werden kann und deren Adresse im gesamten Programm eindeutig ist). Beispiele:
Parameter für den Vorlagentyp:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Template Integer Parameter:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Vorlagenzeigerparameter (Übergabe eines Zeigers an eine Funktion)
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;
Vorlagenreferenzparameter (Übergabe einer Ganzzahl)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Vorlagenvorlagenparameter.
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;
Eine Vorlage ohne Parameter ist nicht möglich. Eine Vorlage ohne explizites Argument ist jedoch möglich - sie enthält Standardargumente:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Syntaktisch template<>
ist reserviert, um eine explizite Vorlagenspezialisierung anstelle einer Vorlage ohne Parameter zu markieren:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
anstelle von your verwendenenum
. Also dieFactorial<0>
Vorlage hättestatic constexpr int value = 1
undtemplate <int N> struct Factorial
kann habenstatic constexpr int value = N * Factorial<N - 1>::value;