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

原文地址:https://www.cnblogs.com/yangtze736-2013-3-6/p/3337924.html