c++templatesstatic-members

Can template classes have static members in C++


Can a template class in C++ have static members? Since it doesn't exist and is incomplete before it is used, is this possible?


Solution

  • Yes. The static member is declared or defined inside the template< … > class { … } block. If it is declared but not defined, then there must be another declaration which provides the definition of the member.

    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
    

    A separate static member is created for each parameterization of the template. It is not possible to have a single member shared across all classes generated by the template. For that, you must define another object outside the template. A partially-specialized traits class might help with that.