关于模板

来源:互联网 发布:java聊天室界面代码 编辑:程序博客网 时间:2024/05/20 14:19

注:编译器版本 VS2013;

#ifndef __TEST_H__#define __TEST_H__#include<iostream>#include<string>#include<stdlib.h>using namespace std;#endif

函数模板

#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>T Add(T left, T right){    return left + right;}int Add(int left, int right){    return left + right;}double Add(double left, double right){    return left + right;}int main(){    cout << Add(10, 20) << endl;    cout << Add<>(10, 20) << endl;    cout << Add(10.1, 20.0) << endl;    cout << Add(10, (int)20.0) << endl;    cout << Add<int>(10, 20.0) << endl;    system("pause");    return 0;}隐式实例化 Add(10,20),通过参数推演出来T的类型,但如果有一个处理int类型的函数,就会直接调用该函数,不会再用模板函数实例化处理int类型的加法函数。Add<>(10,20)必须要模板函数实例化出一个函数,Add(1,'2')像这样无法实例化解决的函数。1:强转a:显式强转Add(10, (int)20.0)b.显式实例化Add<int>(1,'2') 隐士强转,会将字符强转为int

模板函数重载

模板函数重载#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>  const T& Max(const T& left, const T& right){    return(left > right) ? left : right;}//两个函数模板构成重载template<typename T> const T& Max(const T& left, const T& mid, const T& right){    const T& tmp = Max(left, right);    return(tmp > right) ? tmp : right;}int main(){cout << Max(1, 2) << endl;cout << Max(1, 2, 3) << endl;system("pause");    return 0;}

模板函数特化

特化即特殊化,

模板函数特化#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<class T>  //1111const T& Max(const T& left, const T& right){    return(left > right) ? left : right;}模板函数特化,必须给出基础版本  template<>const char*& Max<const char*&>(const char*& Pleft, const char*& Pright){    if (strcmp(Pleft, Pright) > 0)    {        return Pleft;    }    return Pright;}int main(){    const char* p1 = "hello";     const char* p2 = "word";    cout << Max<const char* &>(p1, p2) << endl;    //比较两个地址    //cout << Max("hello", "word") << endl;     return 0;}

特化版本和实例化版本的重载

#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>void Func(const T& x){    count << "T" << x << endl;}void Func(const string& s){    cout << "string" << s << endl;//是上面函数模板的特化版本}int main(){    Func(1);//void Func(const int& x)  ,实例化出来的函数和上面的特化版本的函数构成函数重载,函数名相同,参数类型不同    Func(string("aaaa"));    system("pause");    return 0;}

模板类定义格式及其特化

分为全特化和偏特化;

#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T>class MyClass{public:    MyClass()    {        cout << "MyClass(T)" << endl;    }    ~MyClass()    {        cout << "~MyClass(T)" << endl;    }private:    T a;};//模板类特化template<>class MyClass<string>{public:    MyClass()    {        cout << "MyClass(string)" << endl;    }    ~MyClass()    {        cout << "~MyClass(string)" << endl;    }private:    string a;};int main(){    MyClass<int>s1;    MyClass<string>s2;    system("pause");    return 0;}

这里写图片描述

#define _CRT_SECURE_NO_WARNINGS 1#include "test.h"template<typename T1,typename T2>class MyClass{public:    MyClass()    {        cout << "MyClass<T1,T2>" << endl;    }    ~MyClass()    {        cout << "~MyClass<T1,T2>" << endl;    }private:    T1 a1;    T2 a2;};template<>class MyClass<int,char>//全特化{public:    MyClass()    {        cout << "MyClass<int,char>" << endl;    }    ~MyClass()    {        cout << "~MyClass<int,char>" << endl;    }private:    int a1;    char a2;};template<typename T2>class MyClass<int,T2>//偏特化{public:    MyClass()    {        cout << "MyClass<int,T2>" << endl;    }    ~MyClass()    {        cout << "~MyClass<int,T2>" << endl;    }private:    int a1;    T2 a2;};template<typename T1,typename T2>class MyClass<T1*,T2*>//偏特化,参数进一步限制{public:    MyClass()    {        cout << "MyClass<T1*,T2*>" << endl;    }    ~MyClass()    {        cout << "~MyClass<T1*,T2*>" << endl;    }private:    T1 *a1;    T2 *a2;};template<typename T1, typename T2>class MyClass<T1&, T2*>//偏特化,{public:    MyClass()    {        cout << "MyClass<T1&,T2*>" << endl;    }    ~MyClass()    {        cout << "~MyClass<T1&,T2*>" << endl;    }private:    T1 a1;    T2 a2;};int main(){    MyClass <double, double> m1;    MyClass<int,char>m2;    MyClass<int,double>m3;    MyClass<int*, int*>m4;    MyClass<int&, int*>m5;    system("pause");    return 0;}

这里写图片描述
这里写图片描述

0 0
原创粉丝点击