Une classe de modèle en C++ peut-elle avoir des membres statiques? Puisqu'il n'existe pas et qu'il est incomplet avant son utilisation, est-ce possible?
Oui. Le membre statique est déclaré ou défini à l'intérieur de template< … > class { … }
bloquer. S'il est déclaré mais non défini, il doit y avoir une autre déclaration qui fournit la définition du membre.
template< typename T >
class has_static {
// inline method definition: provides the body of the function.
static void meh() {}
// method declaration: definition with the body must appear later
static void fuh();
// definition of a data member (i.e., declaration with initializer)
// only allowed for const integral members
static int const guh = 3;
// declaration of data member, definition must appear later,
// even if there is no initializer.
static float pud;
};
// provide definitions for items not defined in class{}
// these still go in the header file
// this function is also inline, because it is a template
template< typename T >
void has_static<T>::fuh() {}
/* The only way to templatize a (non-function) object is to make it a static
data member of a class. This declaration takes the form of a template yet
defines a global variable, which is a bit special. */
template< typename T >
float has_static<T>::pud = 1.5f; // initializer is optional
Un membre statique distinct est créé pour chaque paramétrage du modèle. Il n'est pas possible d'avoir un seul membre partagé entre les classes all générées par le modèle. Pour cela, vous devez définir un autre objet en dehors du modèle. Une classe de traits partiellement spécialisée pourrait aider à cela.