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

模板是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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注意:本文中代码均使用 Qt 开发编译环境,如有疑问和建议欢迎随时留言。 模板是 C++ 支持参数化程序设计的工具...
    赵者也阅读 10,972评论 1 5
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,142评论 1 51
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,308评论 19 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,345评论 9 118
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,125评论 0 50