簡體   English   中英

使用 fmt 格式化具有可變大小向量 arguments 的字符串

[英]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]

https://godbolt.org/z/7a79a4d8o

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM