【发布时间】:2021-07-31 08:46:45
【问题描述】:
我已经修改了https://en.cppreference.com/w/cpp/language/parameter_pack 中的示例,以将字符串保存在变量中。我的代码
#include <string>
void tprintf(std::string& str, const std::string& format)
{
str += format;
}
template <typename T, typename... Targs>
void tprintf(std::string& str, const std::string& format, T arg, Targs ...Fargs)
{
for ( int i = 0; i < format.size(); i++ )
{
if ( format.at(i) == '%' )
{
if (format.at(i + 1) == 'd')
{
std::cout << "== 'd' -variable = " << arg << std::endl;
str += std::to_string(arg);
}
else if (format.at(i + 1) == 's')
{
std::cout << "== 's'" << std::endl;
str += arg;
}
tprintf(str, (i + 2 < format.size() ? format.substr(i + 2) : ""), Fargs...);
break;
}
str += format.at(i);
}
}
int main()
{
std::string str;
int age = 24;
std::string name("Hugo");
tprintf(str, "Name: %s, age: %d years\n", name, age);
std::cout << "result = " << str << std::endl;
}
编译代码时出现以下错误:
error: no matching function for call to ‘to_string(std::__cxx11::basic_string<char>&)’
str += std::to_string(arg);
我认为参数包扩展为
-
tprintf(std::string&, const std::string&, std::string, int)arg 是std::string -
tprintf(std::string&, const std::string&, int)arg 是int我可以打电话给std::to_string(arg)但似乎arg的类型不同于int(std::string或其他类型)? 当我删除std::to_string调用时,我得到了一些神秘字符。
如何将年龄值转换为string 并将其附加到str?
【问题讨论】:
-
name是传递给arg的std::string,但to_string中的std::string参数没有重载,因为它已经是一个字符串。虽然 Ngl,但我有时确实希望std::string有一个重载,它什么都不做,并在这种情况下返回一个字符串。 -
@mediocrevegetable1
to_string还有其他缺点,就是要和std::sprintf一样转换,也没有sprintf可以从std::strings转换跨度> -
@mediocrevegetable1 在第一次递归调用 tprintf 之后,我为 int 变量 (age) 调用 to_string。如果我理解正确,函数调用看起来像这样 tprintf(std::string& str, const std::string& format, int arg)。
-
这并不意味着调用
to_string的代码不会被编译两次。即使格式说明符不是%d,它仍然必须编译to_string(arg),这在它是字符串时会导致错误。 -
离题:
at实现了一个额外的范围检查,在像你这样基于向量范围的循环中完全过时了。在这种情况下,您应该首选operator[]。
标签: c++ variadic-functions parameter-pack