gpt4 book ai didi

c++ - 从模板文件生成代码

转载 作者:行者123 更新时间:2023-11-30 04:05:00 25 4
gpt4 key购买 nike

我写了一个模版文件如下

Hello ${Name}
I like ${food}

我想编写一个 C++ 代码,它使用模板文件作为引用生成以下代码

Hello John
I like Pasta
I like Pasta
I like Pasta

有没有办法在 C++ 中做到这一点?我遇到了“ctemplate”,但我并不相信。我正在开发的应用程序是跨平台的。(我想在 C# 中做类似字符串模板的事情)

最佳答案

我之前使用 Boost Spirit 编写了一个模板扩展“引擎”:

它真的是多才多艺

  • 支持嵌套扩展
  • 支持递归扩展
  • 支持动态扩展(例如,如果您希望根据上下文使用不同的值扩展变量)

我刚刚根据您问题的宏语法对其进行了调整。见<强>Live On Coliru


更新

好吧,既然性能似乎是主要目标,这里有一个高度优化的扩展引擎,在基准测试中:

#include <string>
#include <sstream>
#include <map>
#include <boost/utility/string_ref.hpp>

template <typename Range>
std::string expand(Range const& key)
{
if (key == "Name")
return "John";
if (key == "food")
return "Pasta";
return "??";
}

#include <iostream>
int main()
{
static const std::string msg_template =
"Hello ${Name}\n"
"I like ${food}\n"
;

std::ostringstream builder;
builder.str().reserve(1024); // reserve ample room, not crucial since we reuse it anyways

for (size_t iterations = 1ul << 22; iterations; --iterations)
{
builder.str("");
std::ostreambuf_iterator<char> out(builder);

for(auto f(msg_template.begin()), l(msg_template.end()); f != l;)
{
switch(*f)
{
case '$' :
{
if (++f==l || *f!='{')
{
*out++ = '$';
break;
}
else
{
auto s = ++f;
size_t n = 0;

while (f!=l && *f != '}')
++f, ++n;

// key is [s,f] now
builder << expand(boost::string_ref(&*s, n));

if (f!=l)
++f; // skip '}'
}
}
default:
*out++ = *f++;
}
}
// to make it slow, uncomment:
// std::cout << builder.str();
}
std::cout << builder.str();
}

它在 ~0.775 秒内运行 2^22 (4,194,304) 次迭代

查看 Live On Coliru 也是(它在 ~1.8s 内运行)。

关于c++ - 从模板文件生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23515082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com