有“递归”std::格式吗?

问题描述 投票:0回答:1

我有一些这样的代码:

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 行代码以及更好的调用接口与复杂的调用接口的区别(每个类单个执行函数,如果我选择只用一个类来处理所有查询,则每个查询一个函数)。

此外,为每个查询添加一个函数并不是一种选择。根据查询的性质,每个查询都有不同的返回类型(实际上还有不同的返回数量)。该类还根据返回类型和返回次数来解析返回的数据。模板专业化是一个非常好的解决方案。我希望我也可以使用查询字符串本身的专业化。

c++ format
1个回答
1
投票

有“递归”std::格式吗?

不,没有。你必须自己写一个。


我可以选择五种不同的查询类别,或一种模板化的查询类别

考虑使用模板引擎。

我花了 1 分钟搜索 https://www.google.com/search?q=C%2B%2B+templated+engine 结果是 有一个好的 C++ 模板引擎吗https://jinja2cpp .github.io/https://github.com/pantor/inja .

© www.soinside.com 2019 - 2024. All rights reserved.