我完成了必须以 C# 样式进行打印的任务
tprintf("{} world{} {} {} {}\n","Hello",'!',123," Je", "end");
代码如下
void tprintf(const char* format) // base function
{
std::cout << format;
}
template<typename T, typename... Targs>
void tprintf(const char* format, T value, Targs... Fargs)
{
for ( ; *format != '\0'; format++ ) {
if(*format == '{'){
if(format[1] == '}'){
std::cout << value;
tprintf(format+2, Fargs...); // recursive call
return;
}
}
std::cout << *format;
}
}
现在我必须做一些不同的事情:
tprintf("{1} {3} + {2} = {4} {1}.", "11", 7.5 , 4, 11.5);
输出:
11 4 + 7.5 = 11.5 11。
所以我认为这里对 args 进行简单的递归迭代是行不通的。我必须知道所有起作用的参数。我认为我应该做的是开始将所有参数放入数组中,然后将它们输入到模式字符串中的正确位置。但是怎么做?
我做的
template<typename... Args> inline string pass(Args&&...) {return "End";}
template<typename T>
string some_function(T a){
std::ostringstream ostr;
ostr << a;
//cout<<ostr.str();
return ostr.str();
}
template<typename... Args> inline void expand(Args&&... args) {
string a="";
a.append(pass( some_function(args)... ))<<endl;
cout<<" result "<<a<<endl;
}
struct pass {
template<typename ...T> pass(T...) {}
};
但这只会返回“结束”。我意识到这种行为的原因与哪个模板行为和递归有关。在递归中调用的最后一个想法是 template<typename...Args> inline string pass(Args&&...) {return "End";} 所以我扩展函数我只得到 End 字符串而不是包含所有 args 的字符串解析为字符串。
所以我的问题是如何使这个功能正常工作
tprintf("{1} {3} + {2} = {4} {1}.", "", 7.5 , 4, 11.5);