web-dev-qa-db-ja.com

テンプレートクラスはC ++で静的メンバーを持つことができますか

C++のテンプレートクラスに静的メンバーを含めることはできますか?使用前には存在せず不完全なので、これは可能ですか?

29
rubixibuc

はい。静的メンバーは、template< … > class { … }ブロック内で宣言または定義されます。宣言されているが定義されていない場合は、メンバーの定義を提供する別の宣言が必要です。

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

テンプレートのパラメーター化ごとに個別の静的メンバーが作成されます。テンプレートによって生成されたallクラス間で単一のメンバーを共有することはできません。そのためには、テンプレートの外部に別のオブジェクトを定義する必要があります。部分的に専門化された特性クラスはそれを助けるかもしれません。

33
Potatoswatter