得到完整的字符串,同时有格式和args c ++

时间:2016-05-09 06:31:12

标签: c++ string c++11

我正在使用c ++ 11.我想编写一个获取格式化字符串的函数,而args(不知道有多少,需要是可变参数)并返回完整的字符串。

例如:

format = "TimeStampRecord Type=%u Version=%u OptimizeBlockID=%u WriteBlockID=%u Timestamp=%lu"

INDEX_RECORD_TYPE_TIMESTAMP = 3;
FORAMT_VERSION = 1;
optimizeBlockId = 549;
writeBlockId = 4294967295;
timestamp = 1668;

,返回值是一个看起来像这样的字符串:

"TimeStampRecord Type=3 Version=1 OptimizeBlockID=549 WriteBlockID=4294967295 Timestamp=1668"

任何有效的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Boost Format。或者好老sprintf()

char buf[1000];
int bytes = snprintf(buf, sizeof(buf), format, INDEX_RECORD_TYPE_TIMESTAMP,
    FORMAT_VERSION, optimizeBlockId, writeBlockId, timestamp);
assert(bytes < sizeof(buf));
string result(buf, min(sizeof(buf), bytes)); // now you have a C++ string

答案 1 :(得分:0)

您可以按照上面的建议使用snprintf。 如果您想自己实现它或使用自己的占位符:

#include "iostream"
#include "string"

void formatImpl(std::string& fmtStr) {
}

template<typename T, typename ...Ts>
void formatImpl(std::string& fmtStr, T arg, Ts... args) {
  // Deal with fmtStr and the first arg
  formatImpl(fmtStr, args...);
}

template<typename ...Ts>
std::string format(const std::string& fmtStr, Ts ...args) {
  std::string fmtStr_(fmtStr);
  formatImpl(fmtStr_, args...);
  return fmtStr_;
}


int main() {
  std::string fmtStr = "hello %your_placeholder world";
  std::cout << format(fmtStr, 1, 'a') << std::endl;
  return 0;
}

https://godbolt.org/g/hFwiS0