码迷,mamicode.com
首页 > 其他好文 > 详细

模板特化

时间:2015-08-19 23:00:34      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

template specializations

有些时候统一的一个模板不能解决所有的参数问题,例如统一的一个模板有时候不能编译,不能正确实例化,输出结果有问题

模板特例化:函数模板特化,类模板特化

1.函数模板特化  

 例如:定义了一个compare的模板函数用比较定义了“<”的对象,如int,double以及自定义类型。

  a. 为了处理字符串常量,compare("hi","com"),重载了

template<unsigned N,unsigned M>
int compare(const char(&p1)[N],const char(&p2)[M])
注:当比较的字符串长度相同时,GCC 4.83会认为与
int compare(const T& v1,const T& v2) 模糊,无法正确的实例化,编译不通过

   test.cpp: In function ‘int main()’:
   test.cpp:45:34: error: call of overloaded ‘compare(const char [6], const char [6])’ is ambiguous
   cout<<compare("hello","hello")<<endl;
^
    test.cpp:45:34: note: candidates are:
   test.cpp:14:5: note: int compare(const T&, const T&) [with T = char [6]]
  int compare(const T& v1,const T& v2)
^
   test.cpp:25:5: note: int compare(const char (&)[N], const char (&)[M]) [with unsigned int N = 6u; unsigned int M = 6u]
  int compare(const char(&p1)[N],const char(&p2)[M])

b.为了处理字符串指针  cout<<compare(str1,str2)<<endl;我们特化了 int compare(const T& v1,const T& v2),注意特化的格式以及参数类型。

#include<iostream>
#include<cstring>
using namespace std;

template<typename T>
int compare(const T& v1,const T& v2)
{
   if(v1<v2) return -1;
   if(v2<v1) return 1;
   return 0;
}

//Notype template parameter 
//handle string literals,that type is const char[]
template<unsigned N,unsigned M>
int compare(const char(&p1)[N],const char(&p2)[M])
{
    return strcmp(p1,p2);
}

//special version of compare to handle pointers
//to character arrays
template<>
int compare(const char* const& p1,const char* const& p2)
{
    return strcmp(p1,p2);
}

int main()
{
    const char* str1="hello";
    const char* str2="hello";
    cout<<compare(1,2)<<endl;
    
    //note:same string length lead to instantiate ambiguously
    cout<<compare("hello","hell")<<endl;
    cout<<compare(str1,str2)<<endl;

    return 0;
}

 

 

 

 

 

模板特化

标签:

原文地址:http://www.cnblogs.com/wxquare/p/4743180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!