学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第七节 模板(Templates)(2)

设置字体:
----------------------------------

int i;
long l;
k = GetMax (i,l);
上面的调用就是不对的,因为我们的函数等待的是两个同种类型的参数。
我们也可以使得模板函数接受两种或两种以上类型的数据,例如:
template <class T>
T GetMin (T a, U b) { return (a<b?a:b); }
在这个例子中,我们的模板函数 GetMin() 接受两个不同类型的参数,并返回一个与第一个参数同类型的对象。在这种定义下,我们可以这样调用该函数:
int i,j;
long l;
i = GetMin <int, long> (j,l);
或者,简单的用
i = GetMin (j,l);
虽然 j 和 l 是不同的类型。
 
类模板(Class templates)
我们也可以定义类模板(class templates),使得一个类可以有基于通用类型的成员,而不需要在类生成的时候定义具体的数据类型,例如:
template <class T>
class pair {
    T values [2];
public:
    pair (T first, T second) {
        values[0]=first;
        values[1]=second;
    }
};
上面我们定义的类可以用来存储两个任意类型的元素。例如,如果我们想要定义该类的一个对象,用来存储两个整型数据115 和 36 ,我们可以这样写:
pair<int> myobject (115, 36);
我们同时可以用这个类来生成另一个对象用来存储任何其他类型数据,例如:
pair<float> myfloats (3.0, 2.18);
在上面的例子中,类的唯一一个成员函数已经被inline 定义。如果我们要在类之外定义它的一个成员函数,我们必须在每一函数前面加template <... >。
// class templates
#include <iostream.h>
template <class T> class pair {
     T value1, value2;
public:
    pair (T first, T second) {
        value1=first;
        value2=second;
    }
    T getmax ();
};

template <class T>
T pair::getmax (){
    T retval;
    retval = value1>value2? value1 : value2;
    return retval;
}

int main () {
    pair myobject (100, 75);
    cout << myobject.getmax();
    return 0;
}
100
注意成员函数getmax 是怎样开始定义的:
template <class T>
T pair::getmax ()
所有写 T 的地方都是必需的,每次你定义模板类的成员函数的时候都需要遵循类似的格式(这里第二个T表示函数返回值的类型,这个根据需要可能会有变化)。
 
模板特殊化(Template specialization)

模板的特殊化是当模板中的pattern有确定的类型时,模板有一个具体的实现。例如假设我们的类模板pair 包含一个取模计算(module operation)的函数,而我们希望这个函数只有当对象中存储的数据为整型(int)的时候才能工作,其他时候,我们需要这个函数总是返回0。这可以通过下面的代码来实现:
// Template specialization
#include <iostream.h>
template <class T> class pair {
    T value1, value2;
public:
    pair (T first, T second){
        value1=first;
        value2=second;
    }
    T module () {return 0;}
};
template <>
class pair <int> {
    int value1, value2;
public:
    pair (int first, int second){
        value1=first;
        value2=second;
    }
    int module ();
};

template <>
int pair<int>::module() {
    return value1%value2;
}

int main () {
    pair <int> myints (100,75);
    pair <float> myfloats (100.0,75.0);
    cout << myints.module() << '\n';
    cout << myfloats.module() << '\n';
    return 0;
}
25
0
由上面的代码可以看到,模板特殊化由以下格式定义:
----------------------------------
课程列表
重点难点
赞助链接