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完整使用示例相关推荐

  1. 基于 vue3.x + vite + element plus,适配手机、平板、pc 的后台开源免费模板库

    介绍 vue-next-admin 基于 vue3.x + CompositionAPI + typescript + vite + element plus + vue-router-next + ...

  2. C++标准模板库(STL)笔记与示例

    C++标准模板库知识点: /*一.主要内容: sort //必会! next_permutation() //记住怎么调用 list // stack //调用类库 queue //调用类库 vect ...

  3. Google 开源的 Android 排版库:FlexboxLayout

    最近Google开源了一个项目叫「FlexboxLayout」. 1.什么是 Flexbox 简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方 ...

  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

  5. python开源代码-这7个开源的Python库,让你轻松代码分析

    原标题:这7个开源的Python库,让你轻松代码分析 开源最前线(ID:OpenSourceTop) 猿妹编译 来源:https://opensource.com/article/18/7/7-pyt ...

  6. 【代码规范】google开源c\c++项目代码规范

    版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载;https://blog.csdn.net/csdn_baotai https://blog.csdn.net/csdn_baotai/a ...

  7. 值得推荐的C/C++开源框架和库

    原文链接:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm 留档备查,非常强大的C/C++开源项目总结文档- 值得学习的C语言开源项目 ...

  8. Android开源项目及库整理总结

    自己总结的Android开源项目及库. github排名https://github.com/trending, github搜索:https://github.com/search UI Aweso ...

  9. GitHub中Android开源项目及库汇总

    几个常用网站: github排名: https://github.com/trending , github搜索: https://github.com/search codeKK   :    ht ...

最新文章

  1. Python七大原则,24种设计模式
  2. python 点计算角度
  3. java 二分搜索获得大于目标数的第一位_遇到「最值问题」还在无脑动态规划?二分法考虑一下呗
  4. java nio 读取图片_给大忙人们看的 Java NIO 极简教程
  5. Globalplatform TEE api介绍
  6. amount describe
  7. day32 java 多线程(3)了解篇
  8. HTML5/CSS3笔记
  9. 达内python就业班视频_达内python入门到精通全套视频教程
  10. Javaweb尚硅谷网上书城项目
  11. matlab股票数据画图,matlab股票数据接口(一)
  12. ONOS架构中的YANG、P4 Runtime
  13. html 百分比 rem,rem的坑,为什么要设置成百分比,为什么又是62.5%
  14. 8.9 HITTING SET problem
  15. 基于STM32F407标准库串口DMA+空闲中断
  16. OPENSTREETMAP电力数据的情况
  17. 在Linux系统下实现进程,在Linux2.6内核下实现进程隐藏
  18. 使用HTML5/CSS3五步快速制作便签贴特效
  19. [Bom Checker] 物料验证软件
  20. shell脚本学习---nohup

热门文章

  1. 名医高效良方(三叉神经痛)
  2. 游戏里的角色都什么格式图片_Bloom是什么
  3. pspice计算机仿真实验,PSpice二阶动态电路的计算机仿真分析.pdf
  4. 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植及应用
  5. 不用电的计算机(一)
  6. MySQL关系型数据库
  7. MATLAB-数据类型之复数、字符串
  8. 在美国学CS能挣多少钱?美国IT公司标准 offer package详细数字及绿卡政策 | 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛...
  9. Servlet 01
  10. leetcode:雪糕的最大数量