共用方式為


樣板規格

template 宣告包含一組參數型的類別或函式。

template < template-parameter-list > declaration

備註

樣板參數清單 是樣板參數的逗號分隔清單,可以是型別 (以 class 識別項typename 識別項template < 樣板參數清單 > class 樣板參數 listidentifier 的形式出現) 或用於樣板主體的非型別參數。 以下所列為樣板參數語法的範例:

parameter-declaration
class identifier [ = typename ] 
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]

執行個體化類別樣板就像是執行個體化的一般類別,不過必須在角括弧 (<>) 內包含樣板引數。 當樣板引數清單包含類別或 typename 的關鍵字時,樣板引數可以是任意的型別;如果樣板引數為非型別引數,則會根據值調整為適當的型別。 不需要特殊的語法就可以呼叫函式樣板,不過當樣板引數無法由引數推算至函式時,則需利用角括弧和樣板引數。

樣板參數清單 為一種參數清單,樣板函式會利用此清單表示程式碼中即將改變的部份。 例如:

template< class T, int i > class MyStack...

在此情況,樣板可以接收型別 (class T) 和常數參數 (int i)。 樣板會使用 T 型別和常數整數 i 以執行個體化。 在 MyStack 宣告的主體中,需參考 T 的識別項。

樣板宣告本身並不會生成機器碼,但其他程式可利用此樣板參考生成類別、函式家族的機器碼。

樣板宣告有全域、命名空間和類別範圍, 不能宣告於函式中。

以下範例說明類別樣板的宣告、定義和執行個體化型別的參數 T 以及非型別樣板參數的 i。

// template_specifications1.cpp
template <class T, int i> class TestClass 
{
public:
   char buffer[i];
   T testFunc(T* p1 );
};

template <class T, int i>
T TestClass<T,i>::testFunc(T* p1) 
{
    return *(p1++)
};

// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}

非型別樣板引數

非型別樣板參數需為整數類、列舉型別、指標、參考、或成員指標型別,而且在編譯時必須保持一致。 它們可以限定為 const 或 volatile 型別。 浮點值不能當做樣板參數。 雖然類別、結樣或聯合型別物件的指標可以為非型別樣板參數,但此類型別物件不可以當做非型別樣板參數。 做為非型別樣板參數傳遞的陣列會轉換成指標。 做為非型別參數傳遞的函式會被視為函式指標。 字串常數不能當做樣板參數。

在樣板宣告中使用 typename

typename 關鍵字可用於樣板參數清單。 下列樣板宣告是相同的:

template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...

樣板參數的預設引數

類別樣板可利用 = 以指定引數的預設型別或預設值。 函式樣板不能有預設引數。 如需詳細資訊,請參閱類別樣板的預設引數。:

template<typename Type> class allocator {};
template<typename Type, 
   typename Allocator = allocator<Type> > class stack 
{
};
stack<int> MyStack;

樣板參數重複使用

樣板參數清單中的樣板參數可重複使用。 例如以下程式碼所示:

// template_specifications2.cpp

class Y 
{
};
template<class T, T* pT> class X1 
{
};
template<class T1, class T2 = T1> class X2 
{
};

Y aY;

X1<Y, &aY> x1;
X2<int> x2;

int main()
{
}

用於樣板參數的樣板

樣板參數本身也可為樣板。 這類建構方法表示引數本身必須為樣板,且不為其他樣板建構的類別。 在下列範例中,因為沒有任何方法可以使用樣板參數清單中的 A 樣板參數,因此在建構時可省略它。

// template_specifications3.cpp
#include <stdio.h>

template <class T> struct str1
{
   T t;
};

template <template<class A> class T> struct str2
{
    T<int> t;
};

int main()
{
    str2<str1> mystr2;
    mystr2.t.t = 5;
    printf_s("%d\n", mystr2.t.t);
}

Output

5

當做樣板參數的參考

Visual Studio .NET 2003 引進了使用參考做為非型別樣板參數。 這在舊版中是不被允許的。

// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>

extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
   S()
   {
      printf_s("ri is %d\n", ri);
   }

   ~S()
   {
      printf_s("ri is %d\n", ri);
   }
};

int i = 1;

int main()
{
   S<i> s;
   i = 0;
}

Output

ri is 1
ri is 0

巢狀樣板執行個體

當宣告巢狀樣板執行個體時,在 Visual Studio 2005 之前的版本,需在樣板參輸清單之間輸入空白字元。 現在,可以使用下列語法:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

int main() 
{
   A<B<22>>();
}

請參閱

參考

C++ 關鍵字

其他資源

樣板