Google开源C++模板库ctemplate完整使用示例
CTemplate是Google开源的一个使用简单但功能很强大的C++模板库,本文简单介绍其的使用。
入门示例
模板库一般用来隔离数据和展现,这样可以减少数据和展现之间的耦合,使其可以相互独立变化,减少耦合,增加代码的复用,下面我们先看一个简单的例子,模板如下:
Hello {{NAME}},
You have just won ${{VALUE}}!
{{#IN_CA}}Well, ${{TAXED_VALUE}}, after taxes.{{/IN_CA}}
对应的C++代码是:
#include <cstdlib>
#include <iostream>
#include <string>
#include <ctemplate/template.h> int main() {ctemplate::TemplateDictionary dict("example");int winnings = rand() % 100000;dict["NAME"] = "John Smith";dict["VALUE"] = winnings;dict.SetFormattedValue("TAXED_VALUE", "%.2f", winnings * 0.83);// For now, assume everyone lives in CA.// (Try running the program with a 0 here instead!)if (1) {dict.ShowSection("IN_CA");}std::string output;ctemplate::ExpandTemplate("example.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);std::cout << output;return 0;
}
模板中{{NAME}}和{{VALUE}}对应的是变量,在dict中通过dict["NAME"]或dict的setValue的相关方法进行赋值;{{#IN_CA}}和{{/IN_CA}}之间的是一个section,可以通过dict的ShowSection来控制是否要显示这个section。
循环
有的数据我们需要循环展示,比如一个table的多个tr,ctemplate本身不支持循环,需要C++来控制循环,核心思想是多次Insert Section,示例模板如下:
{{#TEST_TABLE}}
<table>{{#TEST_TABLE_ITEM}}<tr><td>{{INDEX}}</td><td>{{NAME}}</td><td>{{AGE}}</td></tr>{{/TEST_TABLE_ITEM}}
</table>
{{/TEST_TABLE}}
对于这个模板,我们先显示外面的这个Section,然后再循环多次Insert里面的子Section就可以了,代码如下:
#include <cstdlib>
#include <iostream>
#include <string>
#include <ctemplate/template.h> int main() {ctemplate::TemplateDictionary dict("loop");dict.ShowSection("TEST_TABLE");for (int i = 0; i != 3; ++i) {ctemplate::TemplateDictionary *item = dict.AddSectionDictionary("TEST_TABLE_ITEM");item->SetFormattedValue("INDEX", "%d", i);item->SetValue("NAME", "阿牛牛牛牛");item->SetValue("AGE", "保密");}std::string output;ctemplate::ExpandTemplate("loop.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);std::cout << output;return 0;
}
文件包含
对于一个通常的系统来说,一般都有多个模板文件,这多个模板文件之间,有很多相同的部分,比如有同样的header、footer,为了减少重复的代码,并且以后修改的话,只需修改一个地方,我们可以把公共的部分提取出来,然后其它的模板文件包含这个文件。ctemplate很好的支持了文件包含,对于ctemplate来说,包含的文件也是一个Section,模板代码如下:
{{>HEADER}}{{#TEST_TABLE}}
<table>{{#TEST_TABLE_ITEM}}<tr><td>{{INDEX}}</td><td>{{NAME}}</td><td>{{AGE}}</td></tr>{{/TEST_TABLE_ITEM}}
</table>
{{/TEST_TABLE}}
注意第一行的{{>HEADER}},这是一个特殊格式的Section,用来表示文件包含。对应的C++代码如下:
#include <cstdlib>
#include <iostream>
#include <string>
#include <ctemplate/template.h> int main() {ctemplate::TemplateDictionary dict("loop");ctemplate::TemplateDictionary *example = dict.AddIncludeDictionary("HEADER");example->SetFilename("./header.tpl");example->SetValue("TITLE", "测试");dict.ShowSection("TEST_TABLE");for (int i = 0; i != 3; ++i) {ctemplate::TemplateDictionary *item = dict.AddSectionDictionary("TEST_TABLE_ITEM");item->SetFormattedValue("INDEX", "%d", i);item->SetValue("NAME", "阿牛牛牛牛");item->SetValue("AGE", "保密");}std::string output;ctemplate::ExpandTemplate("loop.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);std::cout << output;return 0;
}
通过上面的三个示例,掌握了ctemplate的基本使用、循环、文件包含,应该可以满足90%的需求了,如果有其它的需求的话,可以参考ctemplate的官方文档 http://code.google.com/p/ctemplate。感谢您的阅读,欢迎评论,谢谢。
Google开源C++模板库ctemplate完整使用示例相关推荐
- 基于 vue3.x + vite + element plus,适配手机、平板、pc 的后台开源免费模板库
介绍 vue-next-admin 基于 vue3.x + CompositionAPI + typescript + vite + element plus + vue-router-next + ...
- C++标准模板库(STL)笔记与示例
C++标准模板库知识点: /*一.主要内容: sort //必会! next_permutation() //记住怎么调用 list // stack //调用类库 queue //调用类库 vect ...
- Google 开源的 Android 排版库:FlexboxLayout
最近Google开源了一个项目叫「FlexboxLayout」. 1.什么是 Flexbox 简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方 ...
- 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )
文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...
- python开源代码-这7个开源的Python库,让你轻松代码分析
原标题:这7个开源的Python库,让你轻松代码分析 开源最前线(ID:OpenSourceTop) 猿妹编译 来源:https://opensource.com/article/18/7/7-pyt ...
- 【代码规范】google开源c\c++项目代码规范
版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载;https://blog.csdn.net/csdn_baotai https://blog.csdn.net/csdn_baotai/a ...
- 值得推荐的C/C++开源框架和库
原文链接:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm 留档备查,非常强大的C/C++开源项目总结文档- 值得学习的C语言开源项目 ...
- Android开源项目及库整理总结
自己总结的Android开源项目及库. github排名https://github.com/trending, github搜索:https://github.com/search UI Aweso ...
- GitHub中Android开源项目及库汇总
几个常用网站: github排名: https://github.com/trending , github搜索: https://github.com/search codeKK : ht ...
最新文章
- Python七大原则,24种设计模式
- python 点计算角度
- java 二分搜索获得大于目标数的第一位_遇到「最值问题」还在无脑动态规划?二分法考虑一下呗
- java nio 读取图片_给大忙人们看的 Java NIO 极简教程
- Globalplatform TEE api介绍
- amount describe
- day32 java 多线程(3)了解篇
- HTML5/CSS3笔记
- 达内python就业班视频_达内python入门到精通全套视频教程
- Javaweb尚硅谷网上书城项目
- matlab股票数据画图,matlab股票数据接口(一)
- ONOS架构中的YANG、P4 Runtime
- html 百分比 rem,rem的坑,为什么要设置成百分比,为什么又是62.5%
- 8.9 HITTING SET problem
- 基于STM32F407标准库串口DMA+空闲中断
- OPENSTREETMAP电力数据的情况
- 在Linux系统下实现进程,在Linux2.6内核下实现进程隐藏
- 使用HTML5/CSS3五步快速制作便签贴特效
- [Bom Checker] 物料验证软件
- shell脚本学习---nohup
热门文章
- 名医高效良方(三叉神经痛)
- 游戏里的角色都什么格式图片_Bloom是什么
- pspice计算机仿真实验,PSpice二阶动态电路的计算机仿真分析.pdf
- 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植及应用
- 不用电的计算机(一)
- MySQL关系型数据库
- MATLAB-数据类型之复数、字符串
- 在美国学CS能挣多少钱?美国IT公司标准 offer package详细数字及绿卡政策 | 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛...
- Servlet 01
- leetcode:雪糕的最大数量