web-dev-qa-db-fra.com

Les classes de modèles peuvent-elles avoir des membres statiques en C ++

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?

29
rubixibuc

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.

33
Potatoswatter