• C++模板学习


    一、什么是模板?

      模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。模板可以分为两类,一个是模板函数,一个是模板类。

    二、c++中的模板和模板类

      What's better than having several classes that do the same thing to different datatypes? One class that lets you choose which datatype it acts on.

      模板提供了这样一种途径来定义类的行为(无需事先了解哪种数据类型将会被用于类的操作处理上),本质上说就是大家所熟知的泛型编程。

    the basic syntax for declaring a template class is as follows:

    template <class a_type>
    class a_class
    {
         ......   
    };

    在定义模板类中的变量时,如下行所示:

    a_type a_var;

    我们需要将模板类的成员函数定义为模板函数:

    template <class a_type>
    a_type a_class<a_type>::a_function()
    {
         ......   
    }

    when declaring an instance of a template class, the syntax is as follows:

    类模板的实例化对象就叫做特化模板类,模板参数不再使用抽象的类型,而是直接使用具体的类型来实例化该模板类。

    a_class<int> an_example_class;

    下面给出一个模板样例来作为这一小节的结束

    template <class T>
    class calc
    {
         public:
             T multiply(T x, T y);
             T add(T x, T y);
    };
    
    template <class T>
    T calc<T>::multiply(T x, T y)
    {
        return x*y;
    }
    
    template <class T>
    T calc<T>::add(T x, T y)
    {
        return x+y;
    }

    now, when you instantiate an object of class calc you can choose which datatype the class will handle.

    calc<double> a_calc_class;

    三、模板函数

      在上一节中我们已经对模板函数有了一些了解,接下来再较详细介绍一下。模板函数实例化如下,我们在实际应用中可以用任意类型来实例化该模板函数

    #include <stdio.h>
    
    template<class T>
    T cosnt &max(T const &a, T const &b)
    {
         return a < b ? b : a;
    }   
    
    int main()
    {
        printf("The max value is %d
    ",max(4,5));    //max<int>
        printf("The max value is %f
    ",max(4.1,5.1));    //max<float>
        return 0;
    }

      和普通函数重载一样,模板函数也可以实现函数重载的功能,如下所示:

    ///////////////////////////////////////////////////////////
    //  Copyright (c) 2013, ShangHai xxxxx Inc.
    //
    //    FileName:   overloadTemplateFunc.cpp
    //
    //    Description:
    //
    //    Created:    Wed Sep 25 14:41:21 2013
    //    Revision:   Revision: 1.0
    //    Compiler:   g++
    //
    ///////////////////////////////////////////////////////////
    #include <stdio.h>
    
    int const &max(int const &a, int const &b) 
    {
        printf("int const &max(int const &a, int const &b) is called.
    ");
        return a < b ? b : a;
    }
    
    template <class T>
    T const &max(T const &a, T const &b) 
    {
        printf("T const &max(T const &a, T const &b) is called.
    ");
        return a < b ? b : a;
    }
    
    template <class T>
    T const &max(T const &a, T const &b, T const &c) 
    {
        printf("T const &max(T const &a, T const &b, T const &c) is called.
    ");
        return max(max(a,b),c);
    }
    
    class MyClass
    {
        public:
            MyClass(int value):m_value(value)
            {   
            }   
            bool operator<(const MyClass &other) const
            {   
                printf("operator < is called.
    ");
                return m_value < other.m_value;
            }
            int getValue() const
            {
                return m_value;
            }
    
        private:
            int m_value;
    };
    
    int main()
    {
        printf("--------------------------------
    ");
        max(5,10,15);
        printf("--------------------------------
    ");
        max(5,10);
        max<>(5,10);
        max('a','b');
        max('a',10);
        printf("--------------------------------
    ");
        MyClass class1(10),class2(100);
        max(class1,class2);
        printf("--------------------------------
    ");
    
        getchar();
        return 0;
    }

    [yangtze@contex201 ~]$ ./overloadTemplateFunc
    --------------------------------
    T const &max(T const &a, T const &b, T const &c) is called.
    int const &max(int const &a, int const &b) is called.
    int const &max(int const &a, int const &b) is called.
    --------------------------------
    int const &max(int const &a, int const &b) is called.
    T const &max(T const &a, T const &b) is called.
    T const &max(T const &a, T const &b) is called.
    int const &max(int const &a, int const &b) is called.
    --------------------------------
    T const &max(T const &a, T const &b) is called.
    operator < is called.
    --------------------------------

      结合运行结果分析,可以总结以下几点:

    1)编译器在进行函数重载的推演时,首选非模板类型函数;

    max(5,10)的运行结果是:

      int const &max(int const &a, int const &b) is called.

    max(5,10,15)的运行结果是:

      T const &max(T const &a, T const &b, T const &c) is called.
      int const &max(int const &a, int const &b) is called.
      int const &max(int const &a, int const &b) is called.

    2)非模板和模板可以同名,在调用时可以一起进行函数重载的推演(显而易见);

    3)通过max<>方式通知编译器,在推演时只考虑函数模板;

    max<>(5,10)的运行结果是:

      T const &max(T const &a, T const &b) is called.

    4)模板函数实例化过程中,并不会自动完成任何形式的类型转换,而普通函数max通过类型自动转换((int)'a',10)可以覆盖该调用,使得编译器选择了普通函数。

    max('a',10)的运行结果是:

      int const &max(int const &a, int const &b) is called.

    四、模板类特化

      //TODO

  • 相关阅读:
    关系数据库设计一般方法 范式及完整性
    left join, right join , inner join, join, union的意义
    mysql 事务类型表的用法
    Java中静态变量与非静态变量的区别
    JSP生命周期
    Java&Tomcat环境变量配置
    JSP两种声明变量的区别
    一个web页面的访问的过程
    Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 解决
    IDEA:修改JAVA文件自动引入import.*包
  • 原文地址:https://www.cnblogs.com/yangtze736-2013-3-6/p/3337924.html
Copyright © 2020-2023  润新知