《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等类结构体数据,并不能保证其他文件也是用相同变量名,会导致编译时出现二义性;

 

posted @ 2020-11-25 14:46  暮云林凌  阅读(479)  评论(0)    收藏  举报