C++模板机制总结

模板是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时,编译器就会采用上面这个函数;而不再使用通用的模板函数。

时间: 2024-12-26 16:33:35

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

Flask Web Development - Flask 模板1 - 模板机制&Jinja2引擎

节选自PartI Chapter3,这个chapter主要讲模板工作原理,这里讲的就是Jinja2这个模板,另外还提到了Flask-Bootstrap及Flask-Moment两个插件,前者对Flask使用Bootstrap做了些封装,后者对moment.js做了些封装.内容较多,估计分开搞. 模板存在的意义 可维护性高的代码是结构良好且整洁的. 当用户在网站注册一个账户时,他在表单里填入邮箱跟密码,并点击提交按钮.在server端就收到一个包含这些数据的request,再由Flask分发到相应

ECshop模板机制

ECshop模板机制整理 模板机制 近期新项目涉及到ECshop的二次开发,趁此良机正好可以对闻名已久的ECshop系统进行深入了解.要了解一个系统,那么该系统的模板机制就是最重要的一环.相关整理如下: 一.模板引擎: ECshop给我的第一印象是用的smarty模板引擎,可是很快就发现有些不一样,使用smarty模板引擎的系统通常会至少会包括smarty的核心文件:smarty.class.php.smarty_Compiler.php.config_File.class.php和debug.

Shopex模板机制总览(摘要版)

Shopex模板机制总览(摘要版) 此文档旨在为 shopex 二次开发提供一个便利的参考信息,借以打开 shopex 架构的大门,希望能带给读者一种登堂入室的感觉.由于 shopex 是半开放源代码的形式发布的,而且官方也没有意思要做好文档的公开工作,因此,二次开发中难题较多,这篇文章正是出于答疑解难的观点编写的.如果对诸位有大有裨益,则我会心花怒放:即是小有启发,也是我写作的最大满足:如果不才,读者未可以领略到一丝一息的有用内容,口下留情,适当一批或一评即好.本文要求读者有 PHP.HTML

ectouch第四讲之 ECshop模板机制整理

网上的资源感觉还是有些用,可以看看,帮助理解, ECshop模板机制整理 原文:http://blog.sina.com.cn/s/blog_6900af430100nkn8.html 数据处理: ECshop根目录下及admin目录下的文件是对应前台.后台页面的数据处理页,在这些文件中对页面所要展示的内容进行处理,之后通过smarty的assign()方法注册变量,最后通过display()方法加载相应的模板文件.但这里我们需要注意ECshop单独封装的几个方法,用于处理模板的公共内容及页面中

C++模板 &#183; 为什么要引入模板机制?

刚学过类模板时,很不理解,甚至觉得这简直没有用,在自己骗自己嘛!明明很方便的东西,偏偏要加个类模板来回折腾.可能因为我们刚开始写的程序很简单,有时候,可能程序复杂一点,对理解一些概念更有帮助. 今天在网上发现了一篇很好的文章,特此摘录. - 模板的概念 模板是实现代码重用机制的一种工具,它可以实现类型参数化, 即把类型定义为参数,从而实现了真正的代码可重用性.模板可以分为两类:一个是函数模板,一个是类模板. 举例理解: //函数1 int max(int a, int b) { return (

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

C++程序设计要点总结 在编程的过程中呢我们总会遇到一些各种各样的问题,就比如在写方法的时候,我们一个同样的方法要写好几种类型的呢,这让我们很伤脑筋,但是呢C++有一个强大的功能就是模板机制,这个模板机制就可以让我们少写很多同样的代码,那么什么是模板呢,.我们举一个小例子吧!比如我们要去写交换函数,那么我们正常的写法是 1 void swap(int&a,int&b) 2 { 3 int temp=a; 4 a=b; 5 b=temp; 6 } 这样写大家都可以看懂,但是却有一个问题,我们

给CodeIgniter加上phpcms的模板机制

CodeIgniter 很适合小站点应用开发,但是它自带的view功能可能会给不懂PHP的前端人员带来麻烦. 相比之下phpcms的view模板解析就强大多了,所以这里就把PHPCMS的模板解析功能剥离出来,加到PHPCMS上. 首先在CodeIgniter libraries中 增加 template_cache.php大都会娱乐城 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); /** * 模板

centos模板机制作前修改配置

1.关闭selinuxsed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenforce 0 临时生效,想要长期生效,重启系统getenforce 查看selinux状态2.关闭防火墙/etc/init.d/iptables stop/etc/init.d/iptables stop 要关闭至少2次chkconfig iptables off3.精简开机自启动服务chkconfig|egrep -v "cro

laravel模板机制

@extends('layouts.master') @section('title', 'Page Title') @section('sidebar') @parent <p>This is appended to the master sidebar.</p> @endsection @section('content') <p>This is my body content.</p> @endsection {{ isset($name) ? $na