可変長のパラメータパックのまま扱うのがだるい時は tuple で扱うのどうだろう

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...);

    // ...
}

あまりこういうことしているコード見たこと無いなぁと思ったのでメモ.

あと,明けましておめでとうございます.