• 第2章 类模板:2.7 默认类模板实参


    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() << ’
    ’;
        intStack.pop();
    
        // 操作 double stack
        dblStack.push(42.42);
        std::cout << dblStack.top() << ’
    ’;
        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<>来管理内部元素”的栈。

  • 相关阅读:
    hdu 2665 划分树
    概率模型与条件随机场
    shell中各种括号的作用()、(())、[]、[[]]、{}
    今日BBC
    小贝_mysql主从复制作用以及案例
    c++ builder 版CreateAnonymousThread用法
    安卓UI适配限定符
    编译3.10内核 出现错误 “undefined reference to....&quot; 解决方法
    iptables的4表5链(未完)
    已有iptables表的查看
  • 原文地址:https://www.cnblogs.com/5iedu/p/12709151.html
Copyright © 2020-2023  润新知