如何复制c ++ printf函数

时间:2019-07-15 10:40:21

标签: c++

因此,我想将字符串和可变参数转换为完整的字符串,例如printf函数如何用可变变量替换“%?”。这是我要创建的功能:

template<typename... Args>
const char * convert(std::string fmt,Args... arg)
{

  va_list args;
  int location = fmt.find("%d");

  /*Magic which will replace the first "%d" with the first arg*/
  /*Calls itself(recursive) by giving params: the original string with the 
  first "%d" already replaced with the first value, and the Args ... arg 
  without the first variable*/

  const char* returnStr = fmt.c_str();
  return returnStr;
} 

如何实现“ / ** /”中的功能/过程?

具体地说,我的问题是:如何从Args ... arg中删除项目?另外,我如何将Args ... arg返回给自身?我会做阵列还是行得通?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用递归模板和std::string::replace

#include <iostream>
#include <string>

template<typename Arg>
void convertArgument(std::string &fmt, Arg arg) {
  int location = fmt.find("%d");

  fmt.replace(location, 2, arg);
}

template<>
void convertArgument(std::string &fmt, int arg) {
  int location = fmt.find("%d");

  fmt.replace(location, 2, std::to_string(arg));
}

template<typename Arg>
std::string convert(std::string fmt, Arg arg) {
  convertArgument(fmt, arg);
  return fmt;
}

template<typename Arg, typename... Args>
std::string convert(std::string fmt, Arg arg, Args... args) {
  convertArgument(fmt, arg);

  return convert(fmt, args...);
}

int main() {
  std::cout << convert("%d - %d", "ABC", 123).c_str();
  return 0;
}

对于每个参数,将调用一次转换,直到将所有参数嵌入到字符串中为止。您可以将convertArgument模板专门用于自定义类。

添加可以将字符串转换为cstring的结尾。