正确展开paramter包以初始化std :: strings

时间:2017-11-17 18:19:22

标签: c++ c++17

目前我在使用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的每个参数都会转换为字符串并放入数组的元素中。

我对参数包展开有什么看法?或者我是否只是烦人的愚蠢错误?

1 个答案:

答案 0 :(得分:3)

你有一个额外的逗号:

(std::forward<std::string>(std::to_string(args)),...)
//                                              ^

这现在成为逗号上的折叠表达式,它是一个单独的表达式,为您提供一个字符串,您需要N个字符串。此外,该术语未展开,术语是参数包扩展

删除逗号可以提供您想要的内容:

return {{std::to_string(args)...}};

请注意std::forward<>是不必要的 - 所以我也删除了它。