因此,我想将字符串和可变参数转换为完整的字符串,例如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返回给自身?我会做阵列还是行得通?
非常感谢您的帮助!
答案 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的结尾。