C++默认模板自变量(Default Template Arguments)

一、类模板的默认模板自变量

我们可以对 class templates 定义其 template parameters 的默认值,这称为 default template arguments(默认模板自变量)。默认模板自变量值甚至可以引用前一步声明的 template parameters。例如在 class Stack<> 中,你可以把容器类型定义为第二个template parameter,并使用std::vector<> 作为其默认值:
 

#include <vector>
#include <stdexcept>

template <typename T, typename CONT = std::vector<T> >
class Stack {
private:
	CONT elems; // 元素
public:
	void push(T const&); // push 元素
	void pop(); // pop 元素
	T top() const; // 传回 stack 的顶端元素26
	bool empty() const { // stack 是否为空
		return elems.empty();
	}
};

template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
	elems.push_back(elem); // 追加元素
}

template <typename T, typename CONT>
void Stack<T, CONT>::pop()
{
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::pop(): empty stack");
	}
	elems.pop_back(); // 移除最后一个元素
}

template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::top(): empty stack");
	}
	return elems.back(); // 传回最后一个元素的拷贝
}

 

从上面代码可以看到,由于模板如今有两个参数,所以stack类的每一个成员函数的定义式中都必须包含这两个参数:
 

template <typename T, typename CONT>
void Stack<T,CONT>::push (T const& elem)
{
elems.push_back(elem); // 追加元素
}

使用

int main()
{
	try {
		// stack of ints
		Stack<int> intStack;

		// stack of doubles,其内部使用 std::deque<> 来管理元素
		Stack<double, std::deque<double> > dblStack;
		//译注:千万不要声明为 Stack<double, std::deque<int> >,
		// 这是自己砸自己的脚,编译器无法为你做些什么。
	
		intStack.push(7);
		std::cout << intStack.top() << std::endl;

		// 操控 double stack
		dblStack.push(42.42);
		std::cout << dblStack.top() << std::endl;		

	}
	catch (std::exception const& ex) {
		std::cerr << "Exception: " << ex.what() << std::endl;
		return EXIT_FAILURE; // 以错误状态码离开程序
	}
}

二、函数模板的默认模板自变量

函数模板的默认自变量也类似

template <typename T, typename F = std::less<T>>
int compare(const T &v1, const T &v2, F f = F())
{
        if (f(v1, v2)) return -1; 
        if (f(v2, v1)) return 1;
        return 0;
}

int main()
{
        std::cout << compare(1, 2) << std::endl;

        return 0;
}

 

参考:https://blog.csdn.net/love1937/article/details/50344817

 

发布了200 篇原创文章 · 获赞 23 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览