diff --git a/include/tuple b/include/tuple index 50b6bfad..b1136e52 100644 --- a/include/tuple +++ b/include/tuple @@ -72,6 +72,7 @@ public: const unspecified ignore; template tuple make_tuple(T&&...); +template tuple forward_as_tuple(T&&...); template tuple tie(T&...); template tuple tuple_cat(const tuple&, const tuple&); template tuple tuple_cat(tuple&&, const tuple&); @@ -621,6 +622,14 @@ make_tuple(_Tp&&... __t) return tuple::type...>(_STD::forward<_Tp>(__t)...); } +template +inline +tuple<_Tp&&...> +forward_as_tuple(_Tp&&... __t) +{ + return tuple<_Tp&&...>(_STD::forward<_Tp>(__t)...); +} + template struct __tuple_equal { diff --git a/test/utilities/tuple/tuple.tuple/tuple.creation/forward_as_tuple.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.creation/forward_as_tuple.pass.cpp new file mode 100644 index 00000000..4ea7d4ed --- /dev/null +++ b/test/utilities/tuple/tuple.tuple/tuple.creation/forward_as_tuple.pass.cpp @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// tuple forward_as_tuple(Types&&... t); + + +#include +#include + +template +void +test0(const Tuple& t) +{ + static_assert(std::tuple_size::value == 0, ""); +} + +template +void +test1a(const Tuple& t) +{ + static_assert(std::tuple_size::value == 1, ""); + static_assert(std::is_same::type, int&&>::value, ""); + assert(std::get<0>(t) == 1); +} + +template +void +test1b(const Tuple& t) +{ + static_assert(std::tuple_size::value == 1, ""); + static_assert(std::is_same::type, int&>::value, ""); + assert(std::get<0>(t) == 2); +} + +template +void +test2a(const Tuple& t) +{ + static_assert(std::tuple_size::value == 2, ""); + static_assert(std::is_same::type, double&>::value, ""); + static_assert(std::is_same::type, char&>::value, ""); + assert(std::get<0>(t) == 2.5); + assert(std::get<1>(t) == 'a'); +} + +int main() +{ + { + test0(std::forward_as_tuple()); + } + { + test1a(std::forward_as_tuple(1)); + } + { + int i = 2; + test1b(std::forward_as_tuple(i)); + } + { + double i = 2.5; + char c = 'a'; + test2a(std::forward_as_tuple(i, c)); + } +} diff --git a/test/utilities/tuple/tuple.tuple/tuple.creation/pack_arguments.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.creation/pack_arguments.pass.cpp deleted file mode 100644 index 6b7f1891..00000000 --- a/test/utilities/tuple/tuple.tuple/tuple.creation/pack_arguments.pass.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// - -// template -// tuple pack_arguments(Types&&... t); - - -#include - -int main() -{ -#error pack_arguments not implemented -}