Tak, jest to parametr inny niż typ. Możesz mieć kilka rodzajów parametrów szablonu
- Parametry typu.
- Rodzaje
- Szablony (tylko szablony klas i aliasów, bez funkcji i szablonów zmiennych)
- Parametry inne niż typowe
- Wskaźniki
- Bibliografia
- Wyrażenia stałe całkowe
To, co tam masz, jest ostatniego rodzaju. Jest to stała czasowa kompilacji (tak zwane wyrażenie stałe) i jest typu integer lub enumeration. Po sprawdzeniu tego w standardzie musiałem przenieść szablony klas w górę do sekcji typów - mimo że szablony nie są typami. Niemniej jednak w celu opisania tych rodzajów nazywa się je parametrami typu. Możesz mieć wskaźniki (a także wskaźniki składowe) i odniesienia do obiektów / funkcji, które mają zewnętrzne powiązania (te, do których można dowiązać z innych plików obiektowych i których adres jest unikalny w całym programie). Przykłady:
Parametr typu szablonu:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Parametr liczby całkowitej szablonu:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Parametr wskaźnika szablonu (przekazywanie wskaźnika do funkcji)
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;
Parametr odwołania do szablonu (przekazywanie liczby całkowitej)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Parametr szablonu szablonu.
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;
Szablon bez parametrów nie jest możliwy. Ale szablon bez żadnego jawnego argumentu jest możliwy - ma domyślne argumenty:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Składniowo, template<>
jest zarezerwowany do oznaczania wyraźnej specjalizacji szablonu, zamiast szablonu bez parametrów:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
zamiast swojegoenum
. Tak więcFactorial<0>
szablon miałbystatic constexpr int value = 1
itemplate <int N> struct Factorial
może miećstatic constexpr int value = N * Factorial<N - 1>::value;