![](/img/trans.png)
[英]format string with a variable size vector of arguments (e.g. pass vector of arguments to std::snprintf)
[英]format string with a variable size vector of arguments using fmt
我正在尋找一種使用可變大小的變量向量來格式化字符串的方法。 怎么做?
我已經閱讀了帶有 arguments 可變大小向量的格式字符串(例如,將 arguments 的向量傳遞給 std::snprintf)
我喜歡這個答案https://stackoverflow.com/a/57642429/20266935的代碼,但不幸的是,該代碼不起作用,因為fmt::format
使用 constexpr 字符串。
所以我使用fmt::runtime
修改了這個 function 並且它編譯了,但我相信std::accumulate
不能與fmt::format
一起使用,因為它改變了循環中的字符串,一個{}
一個{}
並且庫確實不是這樣的。
#include <fmt/core.h>
#include <numeric>
#include <iostream>
#include <vector>
std::string format_variable_size(const char* fmt, std::vector<int> args){
return std::accumulate(
std::begin(args),
std::end(args),
std::string{fmt},
[](std::string toFmt, int arg){
return fmt::format(toFmt, arg);
}
);
}
std::string runtime_format_variable_size(const char* fmt, std::vector<int> args){
return std::accumulate(
std::begin(args),
std::end(args),
std::string{fmt},
[](std::string toFmt, int arg){
return fmt::format(fmt::runtime(toFmt), arg);
}
);
}
int main()
{
std::vector<int> v = {1,2,3};
std::cout << format_variable_size("[{}, {}, {}]\n", v);
std::cout << runtime_format_variable_size("[{}, {}, {}]\n", v);
return 0;
}
https://godbolt.org/z/337cGEh6d
有什么辦法可以做到嗎?
您可以使用實驗性的dynamic_format_arg_store
API 來做到這一點:
#include <fmt/args.h>
#include <vector>
std::string runtime_format_variable_size(const char* fmt, std::vector<int> args){
auto store = fmt::dynamic_format_arg_store<fmt::format_context>();
for (int arg: args) store.push_back(arg);
return fmt::vformat(fmt, store);
}
int main() {
auto v = std::vector<int>{1, 2, 3};
auto s = runtime_format_variable_size("[{}, {}, {}]\n", v);
fmt::print("{}\n", s);
}
這打印:
[1, 2, 3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.