我有一些这样的代码:
const std::string first = "|>first {} thing<|";
const std::string second = "|>second thing<|";
const std::string third = "|>third thing<|";
const std::string fourth = "|>fourth thing<|";
const std::string out = std::format("Testing {} format {} string {}", first, second, third, fourth);
std::cout << out << std::endl;
此代码输出以下内容:
Testing |>first {} thing<| format |>second thing<| string |>third thing<|
我想要输出代码:
Testing |>first |>second thing<| thing<| format |>third thing<| string |>fourth thing<|
不同之处在于
|>first {} thing<|
已被 |>first |>second thing<| thing<|
取代。也就是说,该格式是递归应用的。 std::format
有很多编译时检查,但理论上没有什么可以阻止 std::vformat
能够递归应用。
在我自己实现此功能之前,我想知道它是否存在于标准库中,或者是否已经有另一个强大的解决方案。
现实世界的例子:
我有五个(大约 40 个)不同的查询,所有这些查询都需要
data1, data2, data3, ...
只是在不同的位置。数据将在运行时已知,但位置将在编译时已知。我可以选择五种不同的查询类,或者一种具有不同专业化的模板:using Query1 = BasicQuery("BLAH {} BLAH");
using Query2 = BasicQuery("BLAH BLAH {}");
等等。这可能是 1500 行代码与 ~250 行代码以及更好的调用接口与复杂的调用接口的区别(每个类单个执行函数,如果我选择只用一个类来处理所有查询,则每个查询一个函数)。
此外,为每个查询添加一个函数并不是一种选择。根据查询的性质,每个查询都有不同的返回类型(实际上还有不同的返回数量)。该类还根据返回类型和返回次数来解析返回的数据。模板专业化是一个非常好的解决方案。我希望我也可以使用查询字符串本身的专业化。
有“递归”std::格式吗?
不,没有。你必须自己写一个。
我可以选择五种不同的查询类别,或一种模板化的查询类别
考虑使用模板引擎。
我花了 1 分钟搜索 https://www.google.com/search?q=C%2B%2B+templated+engine 结果是 有一个好的 C++ 模板引擎吗,https://jinja2cpp .github.io/ 和 https://github.com/pantor/inja .