C++

[C++] 函数模板与类模板

2017-03-30  本文已影响177人  何幻

模板是C++语言与众不同的特性,也是标准库的基础。
一个模板就是一个编译器用来生成特定类类型或函数的蓝图。
生成特定类或函数的过程称为实例化。

我们只编写一次模板,就可以将其用于多种类型和值,
编译器会为每种类型和值进行模板实例化。

我们既可以定义函数模板,也可以定义类模板。
标准库算法都是函数模板,标准库容器都是类模板。

1. 函数模板

template <typename T>
int compare(cont T &v1, const T &v2)
{
    if (v1 < v2)
    {
        return -1;
    }

    if (v2 < v1)
    {
        return 1;
    }

    return 0;
}

int main()
{
    cout << compare(1, 0) << endl;
    // int compare(const int &, const int &)

    vector<int> vec1{1, 2, 3}, vec2{4, 5, 6};
    cout << compare(vec1, vec2) << endl;
    // int compare(const vector<int>&, const vector<int>&)

    return 0;
}

2. 非类型模板参数

template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

int main()
{
    compare("hi", "mom");
    // int compare(const char(&p1)[3],const char(&p2)[4])

    return 0;
}

3. 类模板

(1)类模板定义

template <typename T>
class Blob
{
  public:
    typedef T value_type;
    typedef typename std::vector<T>::size_type size_type;

    Blob();
    Blob(std::initializer_list<T> i1);

    size_type size() const
    {
        return data->size();
    }

    bool empty() const
    {
        return data->empty();
    }

    void push_back(const T &t)
    {
        data->push_back(t);
    }

    void push_back(T &&t)
    {
        data->push_back(std::move(t));
    }

    void pop_back();

    T &back();
    T &operator[](size_type i);

  private:
    std::shared_ptr<std::vector<T>> data;

    void check(size_type i, const std::string &msg) const;
}

(2)构造函数定义

template <typename T>
Blob<T>::Blob() : data(std::make_shared<std::vector<T>>()) {}

template <typename �T>
BLob<T>::Blob(std::initializer_list<T> i1) : data(std::make_shared<std::vector<T>>(i1)) {}

(3)成员函数定义

template <typename T>
void Blob<T>::check(size_type i, const std::string &msg) const
{
    if (i >= data->size())
    {
        throw std::out_of_range(msg);
    }
}

(4)用例

int main()
{
    Blob<int> ia;
    Blob<int> ia2 = {0, 1, 2, 3, 4};

    return 0;
}

参考

C++ primer, 5th - Ch16

上一篇 下一篇

猜你喜欢

热点阅读