c++模板入门
最近使用了c++模板,觉得非常强大,只是写起来需要掌握一点技巧。大部分模板都是直接把定义写在.h头文件,并且有些人还说这样做的原因是模板不支持分编译,可是以前的编译器对模板的支持不够好吧,但是现在完全可以。
环境:
win7 32旗舰版、VS2010 sp1
1、普通函数模板
define.h文件
template<typename T>
T GetString(int value);
define.cpp文件
#include "define.h" template<typename T>
T GetString<T>(int value)
{
return T(value);
} //偏特化
template<>
string GetString<string>(int value)
{
char psz[32] = {0};
itoa(value, psz, 10);
return string(psz);
} //偏特化
template<>
wstring GetString<wstring>(int value)
{
wchar_t psz[32] = {0};
_itow(value, psz, 10);
return wstring(psz);
} /*
如果我们直接包含define.h后,使用GetString<int>(100)函数调用,是使用不了的,会产生链接错误,为什么呢?我们上面定了函数模板的通用
实现,但是并没有实例化为一个真正的函数,既然不是函数,编译器当然不会生成代码,所以会出现链接错误;要解决这个问题的最主要就是实例化函
数模板使之成为一个真正的函数,第一种办法是:使用上面偏特化的方法,例如string和wstring类型的偏特化,因为上面已经写了,所以不多说了;
下面说第二种办法
*/
#define TEMPLATE_GET_STRING(T) template T GetString<T>(int value);
TEMPLATE_GET_STRING(int)//函数模板实例化
// 如果要在dll中导出此函数,我们可以这样
template __declspec(dllexport) int GetString<int>(int value);
2、类模板
define.h文件
template<typename T>
class A
{
public:
A()
{
InitValue();
} void InitValue(); int m_nValue;
};
define.cpp文件
template<typename T>
A<T>::A()
{
InitValue();
} template<>
void A<string>::InitValue()
{
m_nValue = 100;
} template<>
void A<int>::InitValue()
{
m_nValue = 200;
} // 类模板实例化
template
A<int>;
3、成员函数模板
define.h文件
class B
{
public:
template<typename T>
T Get(int index);
};
define.cpp文件
//成员函数模板偏特化
template<>
double B::Get<double>(int index)
{
return 2.1;
} //成员函数模板偏特化
template<>
int B::Get<int><int>(int index)
{
return 1;
}
</int>
//如果类B是一个数据库封装类,我们就可以利用这样的调用方式来获取数据库一条记录中的字段
B b;
b.Get<int>(1);//获取当前记录中第一个字段的值,并转化为int类型
b.Get<double>(2)//获取当前记录中第二个字段的值,并转化为double类型
这样是不是非常方便^^。
c++模板入门的更多相关文章
- doT js模板入门
doT.js github地址: doT.js 官方站点 实例1:简单 <!DOCTYPE html> <html lang="en"> <head& ...
- doT js模板入门 2
doT js 使用{{}} 非常相似于JSP,所以用起来感觉非常亲切,非常顺手 {{–><% }}–>%> 比如: <div id="evaluationtmp ...
- FineReport----报表模板入门教程1
FineReport就一款类Excel操作界面的报表工具,通过拖拖拽拽简单实现报表制作,实现数据展示.数据查询.数据录入功能,并且支持图形多样化展示. 一.入门小例子 1. 打开设计器 启动FineR ...
- [python][flask] Jinja 模板入门
Flask 和 Django 附带了强大的 Jinja 模板语言. 对于之前没有接触过模板语言的人来说,这类语言基本上就是包含一些变量,当准备渲染呈现 HTML 时,它们会被实际的值替换. 这些变量放 ...
- T4 模板入门
T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolkit)是微软官方在 ...
- 【nodejs】jade模板入门
使用jetbrians webstom创建空项目 1.创建package.json 引用依赖配置 { "name": "demojade", "des ...
- C++模板入门教程(一)——模板概念与基本语法
转载请保留以下声明 作者:赵宗晟 出处:http://www.cnblogs.com/zhao-zongsheng/ 前言 有些人提到C++模板就会下意识地觉得可怕.看不懂.避而远之.其实模板并不复杂 ...
- doT js模板入门 3
for 循环前推断循环的list是否为空 <script id="invoiceListDot" type="text/x-dot-template"&g ...
- beetl模板入门例子
加入maven依赖 <dependency> <groupId>org.beetl</groupId> <artifactId>beetl-core&l ...
随机推荐
- 再谈Java方法传参那些事
把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...
- LeetCode OJ 153. Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- POJ 2083 Fractal 分形
去年校赛团队赛就有一道分形让所有大一新生欲生欲死…… 当时就想学了 结果一直拖到…… 今天上午…… 马上要省选了 才会一点基础分形…… 还是自己不够努力啊…… 分形主要是要找到递归点…… 还有深度…… ...
- C#中使用ServiceStack.Redis
.Net操作Redis数据类型String public class DoRedisString : DoRedisBase { #region 赋值 /// <summary> /// ...
- Smarty练习增删改
<?php //将题目表显示在页面 include("../init.inc.php"); include("../DBDA.php"); $db = n ...
- ajax传递的数据类型json传递
$(".del_goods").click(function(){ //删除选中的商品 var clear_data = [];//数组 $("input[name='c ...
- css3字体
1.定义个性化字体 @font-face{ font-family:字体名字; src:字体地址,可以多写几个用逗号隔开兼容浏览器 } div{ font-family:字体名字/*使用字体*/ } ...
- jquery倒计时过几秒页面跳转 js倒计时
//银行认证成功跳转 var time=setInterval (showTime, 1000); var second=5; function showTime() { if(second==0) ...
- ORA-39070
背景介绍: 项目以前建立的库,表空间文件文件比较多,问了一下dba,了解到表空间建立很多没有带来优惠(都在一块磁盘上),效率也不会提高:现在要进行新库的迁移(目前使用的是asm磁盘组rac集群),正好 ...
- Core Animation中的关键帧动画
键帧动画就是在动画控制过程中开发者指定主要的动画状态,至于各个状态间动画如何进行则由系统自动运算补充(每两个关键帧之间系统形成的动画称为“补间动画”),这种动画的好处就是开发者不用逐个控制每个动画帧, ...