表达式参数的模板参数

在以前的经验教训中,您已经学会了如何使用模板类型参数来创建类型独立的函数和类。然而,模板类型参数不是唯一可用的模板参数类型。模板类(不是模板函数)可以使用另一种被称为表达式参数的模板参数。
表达式参数
模板表达式参数是不替代类型的参数,而是由值替换为参数。表达式参数可以是以下任何一个:
有一个整数类型或枚举的值
指向对象的指针或引用
一个函数的指针或引用
一个类成员函数的指针或引用

在下面的示例中,我们创建了一个缓冲类,该类使用一个类型参数和一个表达式参数。类型参数控制缓冲区数组的数据类型,表达式参数控制缓冲区数组的大。

template <typename T, int nSize> // nSize is the expression parameter
class Buffer
{
private:
    // The expression parameter controls the size of the array
    T m_atBuffer[nSize];
 
public:
    T* GetBuffer() { return m_atBuffer; }
	
    T& operator[](int nIndex)
    {
        return m_atBuffer[nIndex];
    }
};
 
int main()
{
    // declare an integer buffer with room for 12 integers
    Buffer<int, 12> cIntBuffer;
 
    // Fill it up in order, then print it backwards
    for (int nCount=0; nCount < 12; nCount++)
        cIntBuffer[nCount] = nCount;
 
    for (int nCount=11; nCount >= 0; nCount--)
        std::cout << cIntBuffer[nCount] << " ";
    std::cout << std::endl;
 
    // declare a char buffer with room for 31 chars
    Buffer<char, 31> cCharBuffer;
 
    // use function strcpy_s to copy a C-style string into the buffer
    strcpy_s(cCharBuffer.GetBuffer(), 31, "Hello there!");
    std::cout << cCharBuffer.GetBuffer() << std::endl;
 
    return 0;
}

关于上面的例子中一个值得注意的事情是,我们不需要动态分配的数组成员m_atbuffer!这是因为对于任何给定的缓冲区类实例nsize实际上是不变的。例如,如果你创建一个缓冲区,编译器代替nsize 12。因此m_atbuffer是int类型[ 12 ],可分配的静态。
模板特殊化
当实例化一个模板类,对于一个给定的类型,编译器模板一份每个模板成员函数,以及用于声明变量的实际类型替换模板类型参数。这意味着一个特定的成员函数将每个实例化的类型具有相同的实现细节。而大多数时候,这正是你想要的,偶尔有情况下,它是实现模板成员函数略有不同的特定数据类型的使用。模板专业化可以让你做到这一。
让我们来看看一个非常简单的例子:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
 
template <typename T>
class Storage
{
private:
    T m_tValue;
public:
    Storage(T tValue)
    {
         m_tValue = tValue;
    }
 
    ~Storage()
    {
    }
 
    void Print()
    {
        std::cout << m_tValue << std::endl;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值