C++ 非类型参数的模版实参

本文深入探讨了C++中类模板的定义与使用,重点介绍了类型参数与非类型参数的概念及应用实例。通过具体示例解释了如何正确地实例化不同类型的类模板。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看见c++中关于类模版的定义有两种,首先,类模版的定义和声明都以关键字template开头,后面接上以逗号分隔的模版参数表(template parameter list),模版参数表以<>括起来,模版参数一种是类型参数(type parameter),另一种是非类型参数(nontype parameter)。关于类型参数模版不多说了,有关键字class或typename接上后面的标识符构成,例如template<class T>  template <typename T>,对于非类型参数模版(nontype parameter)需要注意的是它由普通参数声明构成的,它代表类模版中的一个常量,例如定义template<int a,int b>,这之后就要注意了,给定的非类型参数的表达式必须是一个常量表达式,但是名字空间域的对象的地址可以被用作非类型模版参数的实参,因为名字空间域任何对象的地址是常量表达式(即使不是const定义的),而局部对象的地址不是。例如 template <int a >class A{}; template <int *ptr> class Ap{};  int size=11; const int size_ =12;  则以下的表达式都是可以的 :

A<11> a0;

A<size_> a1;

A<sizeof(size)> a2;

Ap<&size> b0;

值得注意的是,如果一个非类型参数模版的两个表达式的值结果相等,则认为是等价的模版实参,例如Screen<1+2+3,4> s1和Screen<6,2*2> s2认为是引用同一模版实例Screen<6,4>。

指出下面哪些模版的实例化是有效的?

template < int *ptr > class Ptr { ... };
 template < class Type, int size > class Fixed_Array { ... };
 template < int hi, int wid > class Screen { ... };
 (a) const int size = 1024;
 Ptr< &size > bp1;
 (b) int arr[10];

Ptr< arr > bp2;
 (c) Ptr < 0 > bp3;
 (d) const int hi = 40;
 const int wi = 80;
 Screen< hi, wi+32 > sObj;
 (e) const int size_val = 1024;
 Fixed_Array< string, size_val > fa1;
 (f) unsigned int fasize = 255;
 Fixed_Array< int, fasize > fa2;
 (g) const double db = 3.1415;
 Fixed_Array< double, db > fa3;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值