在函数模板和类模板中,模板参数并不仅仅可以当作类型,还可以当作普通值。当使用普通值作为模板参数时,调用者就必须显式的指定这些值。
例如 设置一个固定长度的列表MyList
。且模板参数有 数据类型和容量大小。
只有在增加新的元素时才会与容器大小进行比较。第二个模板参数就是非类型的类模板参数。
具体代码如下:
template
class MyList
{MyList();void PushBack();void PopFront();private:list m_data;uint32_t m_size;
};template
MyList::MyList():m_size{0}
{
}template
void MyList::PushBack()
{if (m_size >= SIZE){throw out_of_range("MyList<>::PushBack() list is full! ");}// ... 功能代码
}template
void MyList::PopFront()
{// ... 功能代码
}
同样函数模板也支持非类型的模板参数。例如配合C++的算法库algorithm
中的std::transform
方法进行全部元素增加。
#include
#include
#include using namespace std;template
T addValue(T const& x)
{return x + VAL;
}int main()
{vector vec{ 9,5,1,2,3,4 };transform(vec.begin(), vec.end(), vec.begin(), addValue);for (const auto& elem : vec){cout << elem << " ";}cout << endl;return 0;
}
函数模板当作回调函数使用时,就需要显式的指定函数模板参数类型。
非类型模板参数也是有要求的,不是所有的类型都支持。