Oui, c'est un non-type de paramètre. Vous pouvez avoir plusieurs types de paramètres de modèle
- Les Paramètres De Type.
- Types
- Les modèles (seules les classes, pas de fonctions)
- Non les Paramètres de type
- Les pointeurs
- Références
- Partie intégrante des expressions constantes
Ce que vous avez là est le dernier type. C'est un moment de la compilation constante (appelée constante de l'expression) et est de type entier ou une énumération. Après le recherchant dans la norme, j'ai dû déplacer modèles de classe dans la section types d' - même si les modèles ne sont pas les types. Mais ils sont appelés par type de paramètres dans le but de décrire ces sortes néanmoins. Vous pouvez avoir des pointeurs (et également membre des pointeurs) et des références à des objets/fonctions qui ont une liaison externe (ceux qui peuvent être liés à d'autres fichiers de l'objet, et dont l'adresse est unique dans l'ensemble du programme). Exemples:
Modèle type de paramètre:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Modèle de paramètre de type entier:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Modèle de pointeur de paramètre (passage d'un pointeur à une fonction)
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;
Modèle de paramètre de référence (passage d'un entier)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Modèle de paramètre du modèle.
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;
Un modèle sans aucun paramètre n'est pas possible. Mais un modèle sans aucun argument explicite est possible - il a des arguments par défaut:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Du point de vue syntaxique, template<>
est réservé à une marque explicite d'une spécialisation de modèle, au lieu d'un modèle sans paramètres:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};