程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中函數模板定制(function template specialization) 詳解

C++中函數模板定制(function template specialization) 詳解

編輯:關於C++

函數模板定制可以解決特定的模板參數, 需要特定的函數方法去實現;

注意函數模板定制是實例化模板, 而不是模板的重載;

有非模板函數(nontemplate function)存在時, 當匹配度相同時, 優先使用非模板函數;

如比較(compare)函數, 比較字符串(char*)類型, 不能通過判斷地址去比較, 應該使用strcmp()函數, 需要定制函數模板;

函數模板定制需要使用 "template<>", 空的尖括號表明 提供的模板實參支持原版本的所有模板形參;

代碼:

/* 
 * CppPrimer.cpp 
 * 
 *  Created on: 2013.12.9 
 *      Author: Caroline 
 */
      
/*eclipse cdt, gcc 4.8.1*/
      
#include <iostream>  
#include <vector>  
#include <cstring>  
      
using namespace std;  
      
template <typename T>  
bool compare (const T& t1, const T& t2)  
{  
    std::cout << "first version" << std::endl;  
    return (t1<t2) ? true : false;  
}  
      
//函數模板定制  
template<>  
bool compare (const char* const &p1, const char* const &p2)  
{  
    std::cout << "third version" << std::endl;  
    return strcmp(p1, p2);  
}
//有非模板優先使用非模板  
/*bool compare (const char* const &p1, const char* const &p2) 
{ 
<span style="white-space:pre">  </span>std::cout << "forth version" << std::endl; 
<span style="white-space:pre">  </span>return strcmp(p1, p2); 
}*/
      
//處理字面類型的比較  
template<unsigned N, unsigned M>  
bool compare (const char (&p1)[N], const char (&p2)[M])  
{  
    std::cout << "second version" << std::endl;  
    return strcmp(p1, p2);  
}  
      
int main(void)  
{  
    const char* w("Wendy");  
    const char* c("Caroline");  
    //沒有函數模板定制, 調用第一個版本, 因為指針不能轉換為數組的引用  
    if(compare(c, w)) {  
        std::cout << "Caroline is long." << std::endl;  
    } else {  
        std::cout << "Wendy is long." << std::endl;  
    }  
      
    if(compare("Caroline", "Wendy")) {  
        std::cout << "Caroline is long." << std::endl;  
    } else {  
        std::cout << "Wendy is long." << std::endl;  
    }  
      
    return 0;  
}

輸出:

third version  
Caroline is long.  
second version  
Caroline is long.

作者:csdn博客 Spike_King

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved