目前我在使用c ++中的参数包。我写了这个小片段:
template<typename ...Targs>
auto toString(Targs... args) -> std::array<std::string,sizeof...(Targs)>
{
return {
{
(std::forward<std::string>(std::to_string(args)),...)
}
};
}
它没有任何实际意义,但练习是从给定参数创建一个字符串数组,其数量和类型可能不同。
我希望实现的目标是:
std::array<std::string,3> SomeName = { {std::to_string(1),std::to_string(2),std::to_string(3)} };
但更通用。这就是toString
函数的想法。不幸的是,我得到的结果并不是我的预期。返回的std::array
将仅包含给toString
的最后一个参数,其余字符串为空。
但我实际上期望的是,给toString
的每个参数都会转换为字符串并放入数组的元素中。
我对参数包展开有什么看法?或者我是否只是烦人的愚蠢错误?
答案 0 :(得分:3)
你有一个额外的逗号:
(std::forward<std::string>(std::to_string(args)),...)
// ^
这现在成为逗号上的折叠表达式,它是一个单独的表达式,为您提供一个字符串,您需要N
个字符串。此外,该术语未展开,术语是参数包扩展。
删除逗号可以提供您想要的内容:
return {{std::to_string(args)...}};
请注意std::forward<>
是不必要的 - 所以我也删除了它。