模板与泛型编程

本文介绍了模板在C++中的应用,包括函数模板、inline函数模板、类模板、类型和非类型形参、模板实例化、成员模板、模板特化及部分特化。通过实例详细解析了模板的工作原理和使用技巧。

1、函数模板:一个独立于类型的函数,可作为一种方式,产生函数的特定类型的版本。

如:template< typename T> int compare(const T &v1,const T &v2)

           if (v1 < v2)  return -1;

           if (v2 < v1)  return 1;

           return 0;

}

模板定义以关键字template开头,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。

模板形参可以是表示类型的类型形参,也可以是表达常量表达式的非类型形参。

使用函数模板时,编译器会推断哪个(或哪些)模板实参绑定到模板形参,一旦编译器确定了实际的模板实参,就称为实例化了函数模板的一个实例。


2、inline函数模板:说明符放在模板形参表之后。

如:template <typename T> inline T min(const T&,const T&);


3、类模板:必须以关键字template开头,后接模板形参表。

如:template <class Type> class Queue {

           public:

               //...

            private:

                //...

};


4、如果模板形参是类型形参,则该形参表示未知类型,如果是非类型形参,则它是一个未知值。


5、每个模板类型形参前面必须带上关键字class或typename,每个非类型形参前面必须带上类型名字,省略关键字或类型说明符是错误的。


6、在模板定义内部指定类型

如:template <class Parm, class U> Parm fcn(Parm* array,U value)

            typename Parm::size_type *p;

}

通过在成员名前加上关键字typename 作为前缀,告诉编译器将成员当作类型。


7、在调用函数时非类型形参将用值代替,值的类型在模板形参表中指定。模板非类型形参是模板定义内部的常量值。非类型模板实参必须是编译时常量表达式。


8、一般而言,不会转换实参以匹配已有的实例化,相反,会产生新的实例。


9、使用函数模板对函数指针进行初始化或赋值

如:template <typename T> int compare(const T&,const T&)

int (*pf1)(const int&,const int&)= compare;


10、在返回类型中使用类型形参

如:template <class T1,class T2,class T3> T1 sum(T2,T3);

调用函数:long val3 = sum<long>(i,lng);

如:template <class T1,class T2,class T3> T3 alternative_sum(T2,T3);

调用函数:long val2 = alternative_sum<long , int  , long >(i,lng);


11、在类本身的作用域内部,可以使用类模板的非限定名。


12、类模板成员函数的定义具有如下形式:

1)必须以关键字template开头,后接类的模板形参表。

2)必须指出它是哪个类的成员。

3)类名必须包含其模板形参。

在类外定义的成员函数的开头:

template <class T> ret-type Classname<T>::member-name


13、类模板成员函数的实例化:用模板形参定义的函数形参的实参运行进行常规转换。


14、成员模板:任意类(模板或非模板)可以拥有本身为类模板或函数模板的成员,这种成员称为成员模板,成员模板不能为虚。

当在类模板作用域外部定义成员模板的时候,必须包含两个模板形参表:

如:template <class T> template<class Iter> void Queue<T>::assign(Iter beg,Iter end)

        destroy();

        copy_elems(beg,end);

}

成员模板只有在程序中使用时才实例化。


15、模板特化:该定义中一个或多个模板形参的实际类型或实际值是指定的。

如:template<> int compare<const char*>(const char* const &v1,const char* const &v2)

         return strcmp(v1,v2);

}

当定义非模板函数的时候,对实参应用常规转换,当特化模板的时候,对实参类型不应用转换。


16、类模板的部分特化

如:template <class T1> class some_template<T1,int>

{

};

部分特化的模板形参表是对应的类模板定义形参表的子集。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值