一、类模板的默认模板自变量
我们可以对 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