《C++ Templates》非类型模板参数
本章主要补全了C++非类型模板参数的问题;
当时不太理解这个有什么用,但是通过一些实例可以大致感受出来;
例如,对于可变数据结构,往往不清楚使用该数据结构的大小应该指定为多少,有可能造成浪费和栈溢出,所以可以该非类型模板参数的方法来指定大小;
template <typename T, int max_size> class stack {
private:
T elems[max_size];
int numElems;
public:
stack();
void push(const T&);
void pop();
const T& top();
bool empty() const;
bool full() const;
};
template <typename T, int max_size> stack<T, max_size>::stack() :numElems(0) {}
template <typename T, int max_size> void stack<T, max_size>::push(const T& a) {
if (numElems == max_size)
throw std::out_of_range("Stack<T,max_size> is full!");
else
elems[numElems++] = a;
}
template <typename T, int max_size> void stack<T, max_size>::pop() {
if (numElems == 0)
throw std::out_of_range("Stack<T,max_size> is empty!");
else
numElems--;
}
template <typename T, int max_size> const T& stack<T, max_size>::top() {
if (numElems == 0)
throw std::out_of_range("Stack<T,max_size> is empty!");
else
return elems[numElems - 1];
}
可以看到,如上所示,可以通过模板类型参数指定该数据结构的大小;
注意问题:
关于非类型模板参数的限制:通常使用常整数,或者只想外部链接对象的指针;
补充:外部链接和内部链接的相关概念
https://blog.csdn.net/sruru/article/details/7951019
总而言之,外部链接使用extern修饰符进行修饰,用于告诉编译器,当前使用的变量或者函数等定义未必在该文件中,有可能只存在声明,应该去其他的依赖文件中寻找相关信息;
并且值得注意的是,extern声明变量只可能在整个全局中存在一个,相当于保证了唯一性;
如果想使用非类型模板实参,只能使用普通变量和外部链接对象指针,来保证全局唯一性;
因为例如其他的string等类结构体数据,并不能保证其他文件也是用相同变量名,会导致编译时出现二义性;

浙公网安备 33010602011771号