#include<windows.h>
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;typedef map<string, string> obj;
string replace_all(const string &str, const string &find_what, const string &replace_with) {
string r = str;
string::size_type pos=0;
while((pos=r.find(find_what, pos))!=string::npos) {
r.erase(pos, find_what.length());
r.insert(pos, replace_with);
pos+=replace_with.length();
}
return r;
}
struct applier {
string& s;
applier(string& str) : s(str) {
} void operator()(pair<string, string> p) {
string search_ = "{" + p.first + "}"; // replace "{xxx}" tags
string replace_ = p.second;
s = replace_all(s, search_, replace_);
}
};class Template {
private:
string html;
public:
Template(string& html) : html(html) {
}
string apply(obj& o) {
string s = html;
for_each(o.begin(), o.end(), applier(s));
return s;
}
};//使用例子
int main(int argc, char* argv[]) { string s = "fly from {src} to {dest}"; Template t(s);// 创建模板 obj o;
o["src"] = string("beijing");
o["dest"] = string("shanghai");
cout << t.apply(o) << endl; // 显示 "fly from beijing to shanghai" o["src"] = string("shanghai");
o["dest"] = string("nanjing");
cout << t.apply(o) << endl; // 显示 "fly from shanghai to nanjing" return 0;
}C++中有无类似的模板? 这个是目前实现的,但是现在需要改进一下,让模板字符串,就是{}里的东西可以为其他形式,比如一个模板是
"fly from {src} to {dest} takes {hour} hours"
"fly from {src} to {dest} takes {hour*60} minutes"
当应用一个 src=beijing, dest=shanghai, hour==2 时候,这两个模板能分别显示
"fly from beijing to shanghai takes 2 hours"
"fly from beijing to shanghai takes 120 minutes"不知道这样的模板可否实现?

解决方案 »

  1.   

    #define FLY_TIME(src, dst, hours) "fly from "src" to "dst" takes "hours" hours"void main()
    {
    printf( FLY_TIME("beijing", "shanghai", "2") );
    }可否?
      

  2.   

    模板再通用,也得有规则吧。规则不同,设计方式可能差别很大。如果只是简单地替换变量为字符串,自己写代码的工作量也不大,问题在于 {hour*60} 的规则复杂度一下子大了很多。这不仅仅是变量替换的问题,还涉及到表达式计算,更加需要把规则具体化,到底要支持哪种规范的表达式呢?如果只是简单的两个值的 +-*/ ,也可以自己写代码,但是你不是想通用吗?你想通用到什么程度?你想表达式支持组合、嵌套、优先级、更多运算符吗?实现表达式绝不只是工作量的大幅增加,还有难度的大幅增加,涉及到词法分析和语法分析,简直是在实现一个编译器。最简单的办法就是使用动态语言,比如脚本语言,表达式计算对它们来说驾轻就熟。
      

  3.   

    template< string src = "beijing", string dest = "shanghai", int time = 2h/120m >
    class xxx和define 一样简单
      

  4.   

    这种想法最初是从脚本语言里看来的,那里头还能支持for,if之类语句, 哈哈,看来想找个现成的库不现实,写的难度时间和收益不成正比,偶还是得自己处理下老。
      

  5.   

    问个题外话  论坛的code怎么没语法高亮了?