C/C++模版

来源:互联网 发布:youcam摄像头软件 编辑:程序博客网 时间:2024/05/17 23:59

函数模板

template <class T> void swap(T& a, T& b){}

当调用模板函数时类型T就会被“被调用时的实参类型”自动所代替,比如swap(a,b)其中abint 型,这时模板函数swap中的形参T就会被int 所代替。不能在函数调用的参数中指定模板形参的类型,对函数模板的调用使用实参自动推演来进行。




类模板

类模板形参不存在实参推演的问题   必须通过尖括号表明 A<int> m

template<class T> class A{

    public:

        T g(T a,Tb);

        A();

};

template<classT> A<T>::A(){}

template<classT> T A<T>::g(T a,T b){

    return a+b;

}




模板的形参

类型模板形参:类型形参由关见字classtypename后接说明符构成,如template<class T> void h(T a){};其中T就是一个类型形参

 

非类型模板形参:模板的非类型形参也就是内置类型形参

template<class T, int a> classB{};其中int a就是非类型的模板形参。

如果有int b,这时A<int, b> m;将出错,因为b不是常量。

如果const int b,这时A<int, b> m;就是正确的,因为这时b是常量。

非类型形参一般不应用于函数模板中。


可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值

template<class T1, class T2=int>class A{};为第二个模板类型形参T2提供int型的默认值。

在类模板的外部定义类中的成员时template 后的形参表应省略默认的形参类型。

比如template<class  T1, classT2=int> class A{public: void h();}

定义方法为template<class T1,class T2> voidA<T1,T2>::h(){}

 

 


原创粉丝点击