C++0x pack_arguments

N3090から<tuple>にstd::pack_arguments()という関数が追加されました。

// <tuple>
namespace std {
  // 20.4.2, class template tuple:
  template <class... Types> class tuple;

  // 20.4.2.4, tuple creation functions:
  const unspecified ignore;

  template <class... Types>
    tuple<VTypes...> make_tuple(Types&&...);
  template <class... Types>
    tuple<ATypes...> pack_arguments(Types&&...);

  ...
}

make_tupleとの違いはなんだろうと思い、仕様を読みながら実際に作ってみました。

#include <string>
#include <tuple>
#include <type_traits>
#include <utility>

template <class... Types>
std::tuple<typename std::add_rvalue_reference<Types>::type...>
    pack_arguments(Types&&... t)
{
    return std::tuple<typename std::add_rvalue_reference<Types>::type...>(
               std::forward<typename std::add_rvalue_reference<Types>::type>(t)...
           );
}

struct X{};

int main()
{
    std::tuple<int&&, X&&, std::string&&> t = pack_arguments(3, X(), std::string("abc"));
}

はい、rvalue参照のタプルを作るヘルパ関数でした。