C++のテンプレートクラスに静的メンバーを含めることはできますか?使用前には存在せず不完全なので、これは可能ですか?
はい。静的メンバーは、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クラス間で単一のメンバーを共有することはできません。そのためには、テンプレートの外部に別のオブジェクトを定義する必要があります。部分的に専門化された特性クラスはそれを助けるかもしれません。