美文网首页C++
[C++] 函数模板与类模板

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

作者: 何幻 | 来源:发表于2017-03-30 13:05 被阅读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

相关文章

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 慕课网-C++远征之模板篇(上)-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • C++ 模板开发

    C++模板开发分为两类: 模板函数开发 模板类开发 模板函数语法: template是关键字,

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • [GeekBand] STL与泛型编程-1

    迭代器(iterator)C++中的类模板(class template)与函数模板(funtion templa...

  • 【C++ Templates(11)】深入模板基础

    参数化声明 C++现在支持四种基本模板:类模板,函数模板,变量模板(variable template),别名模板...

  • C++类模板

    一、定义 C++ 类模板 定义一个 C++ 类模板和定义一个函数模板类似,可以指定一个或者多个模板参数标识符。在类...

  • C++ STL初识及整理

    概述 简介 简单介绍:C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些...

  • C++模板编程/泛型编程

    模板分类 模板分为函数模板与类模板两类。 函数模板 模板声明 模板定义 例如 函数模板实参类型不一致问题 参数推导...

  • 模板与泛型 —— 可变参模板

    一、可变参函数模板 二、可变参类模板 C++ 11 中引入了 可变参模板 (Variadic Template):...

网友评论

    本文标题:[C++] 函数模板与类模板

    本文链接:https://www.haomeiwen.com/subject/mtnuottx.html