2017-11-17 4 views
0

現在、私はC++でパラメータパックを使用しています。私はこの小さなスニペットを書いている:std :: stringsのstd :: arrayを初期化するためにParamterパックが正しく展開されます。

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に与えられた各引数が文字列に変換され、配列の要素に入れられることでした。

パラメータパックのアンフォールディングについて私は何を欠場しましたか?それとも私はちょうどannoyinglyばかげた間違いを持っ​​ていますか?

答えて

3

あなたは余分なコンマを持っている:

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

これは、今あなたがNの文字列をしたい1つの文字列を与える単一の式でカンマ、倍以上の式になります。また、この用語は展開されていません。用語はパラメータパック拡張です。カンマを削除

は何をしたいあなたを与える:

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

注意をstd::forward<>が不要であることを - 私は、あまりにもすることを削除しました。

関連する問題