當(dāng)設(shè)計(jì)開發(fā)一個(gè)類的時(shí)候,程序員通常需要在類的內(nèi)部定義一些靜態(tài)變量。在通常情況下,你會(huì)在一個(gè)類的頭文件中定義一個(gè)靜態(tài)變量并在源代碼程序中初始化,如下所示:??
// File.h
class File
{
// . . . code
private:
static char DELIMETER;
}
// File.cpp
char File:

ELIMETER = "/";
然而,這一方法并不適用于模板類。模板類通常位于頭文件中。生成一個(gè)原文件并沒有太多的用處,因?yàn)槟悴荒転樗玫哪0鍏?shù)初始化。
// Array.h
template< class T>;
class Array
{
// . . .
private:
// hold all instances of this type (T) in an array
static std::vector< Array< T>; *>; s_aAllInstances;
};
// Array.cpp
// illegal C++
template< class T>;
std::vector< Array< T>; >; Array< T>;::s_aAllInstances;
然而,C++允許靜態(tài)函數(shù)在模板中操作,而在一個(gè)靜態(tài)函數(shù)中,你可以調(diào)用一個(gè)靜態(tài)變量。
如下所示:
template< class T>;
class Array
{
//...
private:
typedef std::vector< Array< T>;*>; ElementsArray;
static ElementsArray & s_Elements()
{
static ElementsArray s_array;
return s_array;
}
};
這一技巧功能非常強(qiáng)大,因?yàn)閷?duì)于Array< int>;,你必須提供Array<
int>;::s_Elements;對(duì)于rArray< std::string>;,你必須擔(dān)任 Array<
std::string>;::s等。
這里你必須完成下面的兩個(gè)步驟:
在模板類中必須有一個(gè)模板函數(shù)(不是變量);我們建議你以變量名的形式來為它命名。
在模板函數(shù)中添加靜態(tài)數(shù)據(jù)。
下面的范例包含了Array< T>;類,這一類在內(nèi)部里把每一數(shù)組定義為類型T。當(dāng)某一類型被生成或刪除時(shí),它會(huì)顯示出數(shù)組元素個(gè)數(shù)及其類型。
#include <vector>;
#include <algorithm>;
#include <iostream>;
template< class T>;
struct Type;
template<>;
struct Type< int>;
{
static const char * name() { return "int"; }
};
template<>;
struct Type< long>;
{
static const char * name() { return "long"; }
};
template<>;
struct Type< std::string>;
{
static const char * name() { return "std::string"; }
};
template<>;
struct Type< float>;
{
static const char * name() { return "float"; }
};
/*
holds internal references to its objects
(of Type T)
*/
template< class T>;
class Array
{
public:
Array()
{ AddMe(); }
Array( const Array &

{ AddMe(); }
~Array()
{ DeleteMe(); }
private:
void AddMe()
{
s_Elements().push_back( this);
std::cout
<< "We have added one element of type "
<< Type< T>;::name() << std::endl;
std::cout
<< "We have now " << s_Elements().size()
<< " " << Type< T>;::name() << " elements" << std::endl;
}
void DeleteMe()
{
ElementsArray::iterator itFound =
std::find( s_Elements().begin(), s_Elements().end(), this);
if ( itFound != s_Elements().end())
{
s_Elements().erase( itFound);
}
std::cout
<< "We have deleted one element of type "
<< Type< T>;::name() << std::endl;
std::cout
<< "We have now " << s_Elements().size()
<< " " << Type< T>;::name() << " elements" << std::endl;
}
private:
// note: we're treating it as an internal variable
typedef std::vector< Array< T>;*>; ElementsArray;
static ElementsArray & s_Elements()
{
static ElementsArray s_array;
return s_array;
}
};
int main(int argc, char* argv[])
{
Array< int>; int1;
Array< int>; int2;
Array< long>; long1;
Array< long>; long2;
Array< std::string>; str1;
Array< std::string>; str2;
Array< float>; float1;
Array< float>; float2;
Array< float>; float3;
Array< int>; int3;
Array< long>; long3;
Array< std::string>; str3;
return 0;
}