2.7 Default Class Template Arguments

2.7 默认类模板实参

 

As for function templates, you can define default values for class template parameters. For example, in class Stack<> you can define the container that is used to manage the elements as a second template parameter, using std::vector<> as the default value:

就像函数模板一样,你也可以为类模板参数定义默认值。比如,在类Stack<>里,你可以把用于管理元素的容器定义为第2个模板参数,并且使用std::vector<>作为它的默认值:

#include <vector>
#include <cassert>

template<typename T, typename Cont = std::vector<T>>
class Stack {
 private:
    Cont elems; // elements
 public:
    void push(T const& elem); // push element
    void pop(); // pop element
    T const& top() const; // return top element
    bool empty() const { // return whether the stack is
        emptyreturn elems.empty();
    }
};

template<typename T, typename Cont>
void Stack<T,Cont>::push (T const& elem)
{
    elems.push_back(elem); // append copy of passed elem
}

template<typename T, typename Cont>
void Stack<T,Cont>::pop ()
{
    assert(!elems.empty());
    elems.pop_back(); // remove last element
}

template<typename T, typename Cont>
T const& Stack<T,Cont>::top () const
{
    assert(!elems.empty());
    return elems.back(); // return copy of last element
}

Note that we now have two template parameters, so each definition of a member function must be defined with these two parameters:

可以看到:我们的类模板含有两个模板参数,因此每个成员函数的定义必须具有这两个参数:

template<typename T, typename Cont>
void Stack<T,Cont>::push (T const& elem)
{
    elems.push_back(elem); // append copy of passed elem
}

You can use this stack the same way it was used before. Thus, if you pass a first and only argument as an element type, a vector is used to manage the elements of this type:

你仍然可以像前面例子一样使用这个栈(stack)。就是说,如果你只传递每一个类型实参给这个类模板,那么将会利用vector来管理stack的元素:

template<typename T, typename Cont = std::vector<T>>
class Stack {
private:
    Cont elems; // elements
    …
};

In addition, you could specify the container for the elements when you declare a Stack object in your program:

另外,当在程序中声明Stack对象的时候,你还可以指定容器的类型:

#include "stack3.hpp"
#include <iostream>
#include <deque>

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

    // stack of doubles:使用std::deque<>来管理元素
    Stack< double,std::deque< double>> dblStack;

    // 操作 int stack
    intStack.push(7);
    std::cout << intStack.top() << ’\n’;
    intStack.pop();

    // 操作 double stack
    dblStack.push(42.42);
    std::cout << dblStack.top() << ’\n’;
    dblStack.pop();
}

With Stack< double,std::deque< double>>

you declare a stack for doubles that uses a std::deque<> to manage the elements internally.

使用Stack< double,std::deque< double>>可以声明一个“元素类型为double类型,并且使用std::deque<>来管理内部元素”的栈。