forward_as_tuple.pass.cpp revision 3c1ffbabc1d4510813cedbf83ae3dd06af9476df
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <tuple>
11
12// template<class... Types>
13//     tuple<Types&&...> forward_as_tuple(Types&&... t);
14
15
16#include <tuple>
17#include <cassert>
18
19template <class Tuple>
20void
21test0(const Tuple& t)
22{
23    static_assert(std::tuple_size<Tuple>::value == 0, "");
24}
25
26template <class Tuple>
27void
28test1a(const Tuple& t)
29{
30    static_assert(std::tuple_size<Tuple>::value == 1, "");
31    static_assert(std::is_same<typename std::tuple_element<0, Tuple>::type, int&&>::value, "");
32    assert(std::get<0>(t) == 1);
33}
34
35template <class Tuple>
36void
37test1b(const Tuple& t)
38{
39    static_assert(std::tuple_size<Tuple>::value == 1, "");
40    static_assert(std::is_same<typename std::tuple_element<0, Tuple>::type, int&>::value, "");
41    assert(std::get<0>(t) == 2);
42}
43
44template <class Tuple>
45void
46test2a(const Tuple& t)
47{
48    static_assert(std::tuple_size<Tuple>::value == 2, "");
49    static_assert(std::is_same<typename std::tuple_element<0, Tuple>::type, double&>::value, "");
50    static_assert(std::is_same<typename std::tuple_element<1, Tuple>::type, char&>::value, "");
51    assert(std::get<0>(t) == 2.5);
52    assert(std::get<1>(t) == 'a');
53}
54
55int main()
56{
57    {
58        test0(std::forward_as_tuple());
59    }
60    {
61        test1a(std::forward_as_tuple(1));
62    }
63    {
64        int i = 2;
65        test1b(std::forward_as_tuple(i));
66    }
67    {
68        double i = 2.5;
69        char c = 'a';
70        test2a(std::forward_as_tuple(i, c));
71    }
72}
73