使用 boost::format 和 std::vector

Using boost::format with std::vector

可以将 boost::formatstd::vector<std::string> 一起使用,如下所示。

    std::vector<std::string> name = {"some", "name"};
    boost::format("%s, %s") % name[0] % name[1];

因为我有一个大向量,我想一起使用它们而不需要手动编写索引:

    std::vector<std::string> name = {"some", "name"};
    boost::format("%s, %s") % name;

不能使用 boost::algorithm::join 之类的方法来连接字符串。有没有一种方法可以在不显式写入索引的情况下使用向量实现字符串格式化?

查看此示例:

#include <vector>
#include <string>
#include <iostream>

#include <boost/format.hpp>

auto format_vector(boost::format fmt, const std::vector<std::string> &v) {
    for(const auto &s : v) {
        fmt = fmt % s;
    }
    return fmt;
}

int main() {
    std::vector<std::string> name = {"some", "name"};
    std::cout << format_vector(boost::format("%s, %s"), name) << "\n";
    return 0;
}

(https://godbolt.org/z/nGqW9h)

Operator% 格式在内部存储部分解析的字符串,以及 returns 本身 - 因此它可以像常规用法一样链接。我们可以存储这个部分状态以循环操作。

尽管如此,您仍然需要注意 %s 格式字符串中的正确计数!

这不是在回答问题,而是libfmt likely has what you hope for:

#include <vector>
#include <fmt/ranges.h>

int main() {
  std::vector<int> v = {1, 2, 3};
  fmt::print("{}\n", v);
}

版画

{1, 2, 3}