Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1173|回复: 0
打印 上一主题 下一主题

ctemplate

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2020-2-1 22:26:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2020-2-1 22:28 编辑

https://www.xuebuyuan.com/2608449.html  Google开源C++模板库ctemplate完整使用示例
CTemplate是Google开源的一个使用简单但功能很强大的C++模板库,本文简单介绍其的使用。
入门示例
模板库一般用来隔离数据和展现,这样可以减少数据和展现之间的耦合,使其可以相互独立变化,减少耦合,增加代码的复用,下面我们先看一个简单的例子,模板如下:
  1. Hello {{NAME}},
  2. You have just won ${{VALUE}}!
  3. {{#IN_CA}}Well, ${{TAXED_VALUE}}, after taxes.{{/IN_CA}}
  4. 对应的C++代码是:

  5. #include <cstdlib>
  6. #include <iostream>  
  7. #include <string>
  8. #include <ctemplate/template.h>  

  9. int main() {
  10.     ctemplate::TemplateDictionary dict("example");
  11.     int winnings = rand() % 100000;
  12.     dict["NAME"] = "John Smith";
  13.     dict["VALUE"] = winnings;
  14.     dict.SetFormattedValue("TAXED_VALUE", "%.2f", winnings * 0.83);
  15.     // For now, assume everyone lives in CA.
  16.     // (Try running the program with a 0 here instead!)
  17.     if (1) {
  18.         dict.ShowSection("IN_CA");
  19.     }
  20.     std::string output;
  21.     ctemplate::ExpandTemplate("example.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);
  22.     std::cout << output;
  23.     return 0;
  24. }
复制代码
模板中{{NAME}}和{{VALUE}}对应的是变量,在dict中通过dict["NAME"]或dict的setValue的相关方法进行赋值;{{#IN_CA}}和{{/IN_CA}}之间的是一个section,可以通过dict的ShowSection来控制是否要显示这个section。
循环
有的数据我们需要循环展示,比如一个table的多个tr,ctemplate本身不支持循环,需要C++来控制循环,核心思想是多次Insert Section,示例模板如下:
  1. {{#TEST_TABLE}}
  2. <table>
  3.   {{#TEST_TABLE_ITEM}}
  4.   <tr>
  5.     <td>{{INDEX}}</td>
  6.     <td>{{NAME}}</td>
  7.     <td>{{AGE}}</td>
  8.   </tr>
  9.   {{/TEST_TABLE_ITEM}}
  10. </table>
  11. {{/TEST_TABLE}}
  12. 对于这个模板,我们先显示外面的这个Section,然后再循环多次Insert里面的子Section就可以了,代码如下:

  13. #include <cstdlib>
  14. #include <iostream>  
  15. #include <string>
  16. #include <ctemplate/template.h>  

  17. int main() {
  18.     ctemplate::TemplateDictionary dict("loop");
  19.     dict.ShowSection("TEST_TABLE");

  20.     for (int i = 0; i != 3; ++i) {
  21.         ctemplate::TemplateDictionary *item = dict.AddSectionDictionary("TEST_TABLE_ITEM");
  22.         item->SetFormattedValue("INDEX", "%d", i);
  23.         item->SetValue("NAME", "阿牛牛牛牛");
  24.         item->SetValue("AGE", "保密");
  25.     }

  26.     std::string output;
  27.     ctemplate::ExpandTemplate("loop.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);
  28.     std::cout << output;
  29.     return 0;
  30. }
复制代码
文件包含
对于一个通常的系统来说,一般都有多个模板文件,这多个模板文件之间,有很多相同的部分,比如有同样的header、footer,为了减少重复的代码,并且以后修改的话,只需修改一个地方,我们可以把公共的部分提取出来,然后其它的模板文件包含这个文件。ctemplate很好的支持了文件包含,对于ctemplate来说,包含的文件也是一个Section,模板代码如下:
  1. {{>HEADER}}

  2. {{#TEST_TABLE}}
  3. <table>
  4.   {{#TEST_TABLE_ITEM}}
  5.   <tr>
  6.     <td>{{INDEX}}</td>
  7.     <td>{{NAME}}</td>
  8.     <td>{{AGE}}</td>
  9.   </tr>
  10.   {{/TEST_TABLE_ITEM}}
  11. </table>
  12. {{/TEST_TABLE}}
  13. 注意第一行的{{>HEADER}},这是一个特殊格式的Section,用来表示文件包含。对应的C++代码如下:

  14. #include <cstdlib>
  15. #include <iostream>  
  16. #include <string>
  17. #include <ctemplate/template.h>  

  18. int main() {
  19.     ctemplate::TemplateDictionary dict("loop");

  20.     ctemplate::TemplateDictionary *example = dict.AddIncludeDictionary("HEADER");
  21.     example->SetFilename("./header.tpl");
  22.     example->SetValue("TITLE", "测试");
  23.    
  24.     dict.ShowSection("TEST_TABLE");

  25.     for (int i = 0; i != 3; ++i) {
  26.         ctemplate::TemplateDictionary *item = dict.AddSectionDictionary("TEST_TABLE_ITEM");
  27.         item->SetFormattedValue("INDEX", "%d", i);
  28.         item->SetValue("NAME", "阿牛牛牛牛");
  29.         item->SetValue("AGE", "保密");
  30.     }

  31.     std::string output;
  32.     ctemplate::ExpandTemplate("loop.tpl", ctemplate::DO_NOT_STRIP, &dict, &output);
  33.     std::cout << output;
  34.     return 0;
  35. }
复制代码
通过上面的三个示例,掌握了ctemplate的基本使用、循环、文件包含,应该可以满足90%的需求了,如果有其它的需求的话,可以参考ctemplate的官方文档http://code.google.com/p/ctemplate


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-3 09:42 , Processed in 0.056958 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表