c++中的模板

一、概念:

  所谓模板,通俗的理解就是像模具一样,通过它就能做出东西,一般是样式啥都是固定的,就像所谓的作文模板那样,能用的上就直接拿过来添加点自己的东西。那就是自己的。(我是这样理解的)

 但在编程中,模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式,模板分为模板函数和模板类。

二、模板函数

 举个例子:(假设要实现一个比较两个数是否相等的重载函数)

    bool isEqual(int left,int right)  //第一个函数

    {

         return left == right;

      }

    bool isEqual(const string& left,const string& right)   //第二个函数

     {

        return left == right;

      }

  void test()

{

     string s1("s1"),s2("s2");

     cout<<isequal(s1,s2)<<endl;  //调第二个函数

     cout<<isequal(1,1)<<endl;  // 调第一个函数

}

int main()

{

    test();

    return 0;

}

 以上两个函数是重载函数;所谓重载函数(a、函数名相同,b、函数有不同的参数或函数有不同的参数类型。

三、函数模板的格式

  template <class 形参名1,class 形参名2 class  形参名n)

   返回类型 函数名 (参数列表)

{...}  

 模板形参的定义既可以使用class,也可以用typename,含义是相同的。

  下面定义一个模板函数:

 template<typename T>

 bool IsEqual(const T&left,const T&right)

{

  return left == right;

}

void test()

{

  string s1("s1"),s2("s2");

  cout<<IsEqual(s1,s2)<<endl;

 cout<<IsEqual(1,1)<<endl;

}

 此时编译器会根据传递的参数自动推演出模板形参的类型,并自动生成对应的代码。

四、模板参数的匹配和实列化问题

上例看似很方便很完美但是其实并非如此,想一想如果所传递的参数的类型不同,那么编译器会如何做出抉择呢?

  看看下面的例子:如果我把test改成如下,上述模板还有效吗?

void  test()

{

  cout<<IsEqual(1,1)<<endl;     //参数相同 可以使用上述模板

  cout<<IsEqual(1,1.1)<<endl;  //参数不同 编译器 如何抉择???

}

如果遇到上面第二种情况时,我们这样写:

cout<<IsEqual<int>(1,1.1)<<endl;先指定一个类型另一个类型让编译器去抉择;







  


你可能感兴趣的:(函数模板)