C++中函数模板定制(function template specialization) 详解

函数模板定制可以解决特定的模板参数, 需要特定的函数方法去实现;

注意函数模板定制是实例化模板, 而不是模板的重载;

有非模板函数(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

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, include
, 模板函数
, 模板
, template
, 函数模板
, 形参
, 函数详解
尖括号
arttemplate模板引擎、js template 模板引擎、stringtemplate 模板、template模板、template模板 语法 js,以便于您获取更多的相关知识。

时间: 2024-12-31 14:14:07

C++中函数模板定制(function template specialization) 详解的相关文章

c++ 函数模板重载-关于c++中函数模板的重载问题

问题描述 关于c++中函数模板的重载问题 直接上代码(简单),enter code here template< class T > void test(T x){ cout<<x<<endl; } void test(int); int main(){ int x = 1; test(x); } 上述程序使用非模板函数对函数模板test进行重载:按照书中的说法-这个非模板函数可以只声明原型,然后借用模板中定义的函数体. 但是链接的时候找不到那个非模板函数的定义(使用的

JQuery中$.each 和$(selector).each()的区别详解

 这篇文章主要介绍了JQuery中$.each 和$(selector).each()的区别详解,本文给出了多个例子讲解了它们之间的不同之处,需要的朋友可以参考下     一个通用的遍历函数 , 可以用来遍历对象和数组. 数组和含有一个length属性的伪数组对象 (伪数组对象如function的arguments对象)以数字索引进行遍历,从0到length-1, 其它的对象通过的属性进行遍历. $.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前

JavaScript函数节流概念与用法实例详解_javascript技巧

本文实例讲述了JavaScript函数节流概念与用法.分享给大家供大家参考,具体如下: 最近在做网页的时候有个需求,就是浏览器窗口改变的时候需要改一些页面元素大小,于是乎很自然的想到了window的resize事件,于是乎我是这么写的 <!DOCTYPE html> <html> <head> <title>Throttle</title> </head> <body> <script type="text

PHP中Closure类的使用方法及详解_php实例

Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. Closure 类(PHP 5 >= 5.3.0)简介 用于代表 匿名函数 的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,下面我们来看一下PHP Closure类的使用方法及介绍. PHP Closure类之前在PHP预定义接口中介绍过,但它可不是interface哦,它是一个内部的final类.Clo

MySQL 中修改密码及访问限制设置详解

mysql|访问|详解 MySQL中修改密码及访问限制设置详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成.由于其源码的开放性及稳定性,且与网站流行编?挥镅?PHP的完美结合,现在很多站点都利用其当作后端数据库,使其获得了广泛应用.处于安全方面的考虑,需要为每一用户赋于对不同数据库的访问限制,以满足不同用户的要求.下面就分别讨论,供大家参考. 一.MySQL修改密码方法总结 首

Python中使用不同编码读写txt文件详解

  这篇文章主要介绍了Python中使用不同编码读写txt文件详解,本文给出不同编码下的读写文件代码方法,需要的朋友可以参考下 代码如下: import os import codecs filenames=os.listdir(os.getcwd()) out=file("name.txt","w") for filename in filenames: out.write(filename.decode("gb2312").encode(&q

c语言计时函数返回时间不定,求详解为什么(只点击了两次运行,并未改变代码)

问题描述 c语言计时函数返回时间不定,求详解为什么(只点击了两次运行,并未改变代码) 代码如上, 结果如下: 第一次 第二次: 解决方案 同样的代码,执行过程中计算机可能遇到各种小问题,一般来说短期内第二次运行会快点. 第一次会进行资源的分配,将代码拷到内存里,再执行. 如果在很短的时间内进行第二次运行,代码还在内存里,CPU少了将代码拷到内存的操作,所以会快上一点. 你问的这个问题设计到了操作系统的CPU局部性策略,操作系统在执行程序时,并不是像C一样,顺序执行,因为同一时间,并不是只有你的程

js基础之DOM中document对象的常用属性方法详解_javascript技巧

-----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返回对文档中所有 Anchor 对象的引用.还有document.links/document.forms/document.images等 2  document.URL       返回当前文档的url 3  document.title       返回当前文档的标题 4  do

基于java集合中的一些易混淆的知识点(详解)_java

(一) collection和collections 这两者均位于java.util包下,不同的是: collection是一个集合接口,有ListSet等常见的子接口,是集合框架图的第一个节点,,提供了对集合对象进行基本操作的一系列方法. 常见的方法有: boolean add(E e) 往容器中添加元素:int size() 返回collection的元素数:boolean isEmpty() 判断此容器是否为空: boolean contains(Object o) 如果此collecti