模板是C++中非常重要的组成部分,之前自己对这块领域一直不太熟悉。最近趁着有时间学习了一下,特此总结。

首先是函数模板,它的定义方式如例子所示:

template <typename T>T sum(T a,T b)
{
return a+b;
}

类也有自己的模板,称为类模板,如下所示:

template <typename T>class Proxy
{
public:
typedef T value_type;
Proxy();
~Proxy();
value_type val;
}; template<typename T> Proxy<T>::Proxy()
{
val=T(10);
} template<typename T> Proxy<T>::~Proxy()
{ }

 要特别注意的是,C++中类模板的声明和定义应当放到同一个.h文件下,不能将声明和定义分散在不同的文件中。

类模板也可以有自己的友元函数和静态变量:

template <typename>class Proxy;
template <typename T>bool operator==(const Proxy<T>&,const Proxy<T>&);
template <typename T>class Proxy
{
public:
typedef T value_type;
Proxy();
~Proxy();
void printval();
friend bool operator==<T>(const Proxy<T>&,const Proxy<T>&);
value_type val;
static T abc;
};
template<typename T> void Proxy<T>::printval()
{
std::cout<<val<<std::endl;
}
template <typename T> T Proxy<T>::abc=0;

无论是模板类还是普通类,都可以有自己的模板函数,编译器会根据具体代码的内容实例化特定的模板成员函数。

template <typename T>class Proxy
{
public:
template<typename U>void printNum(U num);
}; template<typename T>template<typename U>void Proxy<T>::printNum(U num)
{
std::cout<<num<<std::endl;
}

  当我们引用模板函数的时候,编译器利用调用中的函数实参来确定其模板参数,这叫做模板实参推断。但只有有限的几种类型转换会自动地应用于这些实参(const转换、数组或函数指针转换)。拿一段代码来举个例子:

template <typename T>T sum(T a,T b)
{
return a+b;
} sum(10,10.5);//this code is error!

在引用sum的时候,实参一个是int类型,一个是double类型,此时不能像普通函数一样实现类型转换。以上代码在编译器是不通过的。

而如果先将函数显示实例化,则就可以实现参数类型转换了:

sum<int>(10,10.5);

当我们不能(或不希望)将模板定义用于某些特定类型时,模板特例化就派上用场了。模板特例化就是一个用户提供的模板实例,它将一个或多个模板参数绑定到特定类型或值上。比如之前定义的sum函数,可以针对Sale_Data类特例化:

template<>
Sale_Data sum(Sale_Data a,Sale_Data b)
{
Sale_Data c;
c.index=a.index+b.index;
return c;
}

这样一来,当我们为Sale_Data调用sum时,编译器就会采用上面这个函数;而不再使用通用的模板函数。

另外还需要记住typename的使用,如下面例子所示:

template <typename T>class A
{
public:
struct AS{};
}; void test()
{
typename A<int>::AS as;
}

此时在test函数中,如果我们不加typename,那么编译器无法确认AS到底A中的一种类型还是一种静态变量,因此需要用这种方式来声明。

例外情况如下所示:

(1)类模板定义中的基类列表

template<class T>
class Derived: public Base<T>::XXX
{
...
}

(2)类模板定义中的初始化列表

Derived(int x) : Base<T>::xxx(x)
{
...
}

为什么这里不需要呢?因为编译器知道这里需要的是类型还是变量,(1)基类列表里肯定是类型名,(2)初始化列表里肯定是成员变量名。

C++模板机制总结的更多相关文章

  1. ectouch第七讲 之ECshop模板机制整理

    网上的资源感觉还是有些用,可以看看,帮助理解,ECshop模板机制整理原文:http://blog.sina.com.cn/s/blog_6900af430100nkn8.html 一.模板引擎: E ...

  2. ECshop模板机制

    ECshop模板机制整理 模板机制 近期新项目涉及到ECshop的二次开发,趁此良机正好可以对闻名已久的ECshop系统进行深入了解.要了解一个系统,那么该系统的模板机制就是最重要的一环.相关整理如下 ...

  3. C++编译器模板机制剖析

    思考:为什么函数模板可以和函数重载放在一块.C++编译器是如何提供函数模板机制的? 一.编译器编译原理 什么是gcc gcc(GNU C Compiler)编译器的作者是Richard Stallma ...

  4. C++模板 · 为什么要引入模板机制?

    刚学过类模板时,很不理解,甚至觉得这简直没有用,在自己骗自己嘛!明明很方便的东西,偏偏要加个类模板来回折腾.可能因为我们刚开始写的程序很简单,有时候,可能程序复杂一点,对理解一些概念更有帮助. 今天在 ...

  5. C++11程序设计要点总结-模板机制详解

    C++程序设计要点总结 在编程的过程中呢我们总会遇到一些各种各样的问题,就比如在写方法的时候,我们一个同样的方法要写好几种类型的呢,这让我们很伤脑筋,但是呢C++有一个强大的功能就是模板机制,这个模板 ...

  6. WPF源代码分析系列一:剖析WPF模板机制的内部实现(一)

    众所周知,在WPF框架中,Visual类是可以提供渲染(render)支持的最顶层的类,所有可视化元素(包括UIElement.FrameworkElment.Control等)都直接或间接继承自Vi ...

  7. ecshop 模板机制

    ECShop模板是基于smarty 文件名cls_template.php lib_main.php中的assign_template()会设置我们的网店的公共信息及网站设置:assign_dynam ...

  8. C++(四十三) — 函数模板机制

     1.普通函数与模板函数调用原则 函数模板可以像普通函数一样被重载: 当函数模板和普通函数都符合条件时,编译器优先考虑普通函数: 但如果函数模板产生一个更好的匹配,则选择函数模板: 可以通过空模板实参 ...

  9. laravel模板机制

    @extends('layouts.master') @section('title', 'Page Title') @section('sidebar') @parent <p>This ...

随机推荐

  1. keras 入门之 regression

    本实验分三步: 1. 建立数据集 2. 建立网络并训练 3. 可视化 import numpy as np from keras.models import Sequential from keras ...

  2. HDFS的运行原理

    简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...

  3. Swift建立栈的泛型结构体以及top()、push()、pop()定义函数的定义

    首先可以使用swift定义Stack的结构体 //泛型表达 struct Stack<T> { var items = <T>() //定义栈顶函数,返回栈顶元素 mutati ...

  4. Ext.Window 的常见属性

    Ext.Window 的常见属性:    plain:true,(默认不是)    resizable:false,(是否可以改变大小,默认可以)    maximizable:true,(是否增加最 ...

  5. Spark 累加器

    由于spark是分布式的计算,所以使得每个task间不存在共享的变量,而为了实现共享变量spark实现了两种类型 - 累加器与广播变量, 对于其概念与理解可以参考:共享变量(广播变量和累加器).可能需 ...

  6. 前端学习 第七弹: Javascript实现图片的延迟加载

    前端学习 第七弹: Javascript实现图片的延迟加载 为了实现图片进入视野范围才开始加载首先: <img    src="" x-src="/acsascas ...

  7. jd-gui报错INTERNAL ERROR 解决办法

    问题:我用dex2jar工具反编译了apk文件,但当我用jd-gui反编译前面操作获得的jar文件的时,能很完美地看到大部分类反编译后的代码,但有一部分类不能显示出来--constants类,仅仅显示 ...

  8. 微信收藏导出到PC端的方法,不要再傻傻的用网页版转换了!

    微信里面收藏了很多有意思的东西,想转到PC上保存起来,以防万一哪天链接失效了. 另外PC上面看,屏幕大一些,也爽一些. 以前的方法是需要通过网页版来传输一下,现在微信有了PC客户端,很方便,直接安装P ...

  9. LeetCode 【347. Top K Frequent Elements】

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  10. JavaScript 介绍

          JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 ...