如何复制C++ Primtf函数

如何复制C++ Primtf函数,c++,C++,所以我想把一个字符串和可变变量转换成一个完整的字符串,比如printf函数如何用可变变量替换%?s。下面是我要创建的函数: template<typename... Args> const char * convert(std::string fmt,Args... arg) { va_list args; int location = fmt.find("%d"); /*Here is the code to convert the string*/ cons

所以我想把一个字符串和可变变量转换成一个完整的字符串,比如printf函数如何用可变变量替换%?s。下面是我要创建的函数:

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

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

  /*Here is the code to convert the string*/

  const char* returnStr = fmt.c_str();
  return returnStr;
} 
如何实现/**/中的功能/流程?以下是我遇到的问题:

具体来说,我的问题是:如何从参数中删除项目。。。阿格?另外,如何返回参数。。。arg本身?我需要一个数组还是什么可以工作


非常感谢你的帮助

您可以使用递归模板和:

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


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

我们不是代码编写服务。陈述一个具体问题,我们很乐意提供帮助。你试过什么?什么不起作用?建议搜索%然后从那里开始工作。我的问题是:如何从参数中删除项目。。。阿格?另外,如何返回参数。。。arg本身?我需要一个数组还是什么可以工作?谢谢至于如何删除一个参数-有一个例子,它甚至有一个简单的_printf!;但是请记住,删除在C++中有特定的含义,并且以一种方式提供参数,如果删除一个,就会发生坏的事情。编写一个函数,使用运行时计算的索引提取元组的适当部分。这并不容易,因为std::get需要一个编译时常量,但使用递归助手类是可行的。这些技术太复杂,无法在stackoverflow.com上用几句话来解释,并且需要模板元编程的高级知识。对于初学者来说,这显然太难了,所以不要尝试这一点,继续阅读你的C++书籍并继续学习模板,直到你可以回答自己的问题,这里。我想你不需要空格EntralGuMUTSTST::String & FMT,INTARG部分。无论如何,非常感谢@在模板void convertArgumentstd::string&fmt中,int-arg用于减少代码重复并轻松添加专门的转换模板。。。将输入VASPINTFCHAR**strp、const char*fmt、VAU列表ap;同样的工作?谢谢@不,可变模板是类型安全的。一个可变函数不是。
#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;
}