C++11 から入った可変長テンプレート引数,便利ですがパラメータパックの扱いがとっつきにくいです.
下記のように一旦 tuple で受ければその後は std::tuple
のインターフェースで受けて自由にできるので
良いんじゃないかという気がする.
template<class... Args> void do_something(Args &&... args) { auto t = std::make_tuple(std::forward<Args>(args)...); // 一度 tuple で受ければあとは tuple のインターフェースで // 好きに使う std::cout << std::get<0>(t) << std::endl; std::cout << std::get<1>(t) << std::endl; std::cout << std::get<2>(t) << std::endl; // あと,generic lambda で可変長引数を使うときとか特に便利そうな感じがする auto const f = [](auto &&... args) { auto t = std::make_tuple(std::forward<Args>(args)...); // ... よしなに }; }
けれど,左辺値参照渡すとコピーが発生してしまうので,std::forward
せずに std::forward_as_tuple
で参照の tuple のまま扱ったほうが良いのかも.
template<class... Args> void do_something(Args &&... args) { // args... は左辺値参照なので,結果も左辺値参照の tuple auto t = std::forward_as_tuple(args...); // ... }
あまりこういうことしているコード見たこと無いなぁと思ったのでメモ.
あと,明けましておめでとうございます.