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参照のタプルを作るヘルパ関数でした。