模板规范

template 声明指定一组参数化类或函数。

template < template-parameter-list > declaration

备注

模板参数列表 是逗号分隔列表的模板参数,这可能是类型 (在窗体 标识符typename标识符,或者 模板 AMP_LT 模板参数列表 AMP_GT 类 标识符) 或在模板主体的非类型参数。 模板参数的语法是下列值之一:

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

您可以实例化这与您的模板将实例化常规类的类,但是,您必须包含在尖括号 (AMP_LTAMP_GT) 中的模板参数。 这些模板参数可以是任何类型,如果模板参数列表包含类或 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()
{
}

非类型模板参数

非类型模板参数必须是整型,枚举,指针,引用或指向成员的指针类型,并且必须是常数在编译时。 它们可以限定为常数或变量的类型。 浮点值不允许作为模板参数。 类、结构或联合类型的对象不允许作为非类型模板参数,不过,对于此类对象的指针允许的。 作为非类型模板参数传递的数组转换为指针。 作为非类型参数传递函数将函数指针。 字符串不允许作为模板参数。

使用在模板声明的类型名称

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);
}

x5w1yety.collapse_all(zh-cn,VS.110).gifOutput

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;
}

x5w1yety.collapse_all(zh-cn,VS.110).gifOutput

ri is 1
ri is 0

嵌套模板的实例

Visual Studio 的版本在 Visual Studio 2005 之前的要求空白插入到模板参数列表之间,如果嵌套模板的实例声明。 下面的语法现在允许:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

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

请参见

参考

C++关键字

其他资源

模板