1111/* ! \ingroup tuple
1212 * Empty Tuple.
1313 */
14- template <class ... Membs >
15- struct Tuple {};
14+ template <class ...>
15+ class Tuple {};
1616
1717/* ! \ingroup tuple
1818 * Non-empty Tuple.
1919 */
20- template <class H , class ... Tail>
21- struct Tuple <H, Tail...> {
22- H head {}; // !< First element.
23- Tuple<Tail...> tail {}; // !< Remaining elements.
20+ template <class T , class ... Ts>
21+ class Tuple <T, Ts...> {
22+ public:
23+ Tuple () = default ;
24+ Tuple (T h, Ts... t);
25+
26+ T head {}; // !< First element.
27+ Tuple<Ts...> tail {}; // !< Remaining elements.
2428};
2529
2630
31+ template <class T , class ... Ts>
32+ Tuple<T, Ts...>::Tuple(T h, Ts... t) : head {h}, tail {t...} {}
33+
34+
2735/* !
2836 * Access the type of the *k*-th element in a Tuple.
2937 *
@@ -33,63 +41,46 @@ template <size_t, class>
3341struct ElemTypeHolder_ ;
3442
3543// ! \copydoc ElemTypeHolder_
36- template <class H , class ... Tail >
37- struct ElemTypeHolder_ <0 , Tuple<H, Tail ...> > {
38- typedef H type;
44+ template <class T , class ... Ts >
45+ struct ElemTypeHolder_ <0 , Tuple<T, Ts ...> > {
46+ typedef T type;
3947};
4048
4149// ! \copydoc ElemTypeHolder_
42- template <size_t k, class H , class ... Tail >
43- struct ElemTypeHolder_ <k, Tuple<H, Tail ...> > {
44- typedef typename ElemTypeHolder_<k - 1 , Tuple<Tail ...> >::type type;
50+ template <size_t k, class T , class ... Ts >
51+ struct ElemTypeHolder_ <k, Tuple<T, Ts ...> > {
52+ typedef typename ElemTypeHolder_<k - 1 , Tuple<Ts ...> >::type type;
4553};
4654
4755
4856/* ! \ingroup tuplehelper
49- * Get the *k*-th element of a Tuple or Object .
57+ * Get the *k*-th element of a Tuple.
5058 *
5159 * This can be used for both retrieval as well as assignment.
5260 *
5361 * \param t A Tuple.
5462 *
5563 * \return Reference to the *k*-th element in `t`.
5664 */
57- template <size_t k, class ... Membs >
65+ template <size_t k, class ... Ts >
5866// ! \cond
5967typename enableIf<
60- k == 0 , typename ElemTypeHolder_<0 , Tuple<Membs ...> >::type&>::type
68+ k == 0 , typename ElemTypeHolder_<0 , Tuple<Ts ...> >::type&>::type
6169// ! \endcond
62- get (Tuple<Membs ...>& t) {
70+ get (Tuple<Ts ...>& t) {
6371 return t.head ;
6472}
6573
66- template <size_t k, class ... Membs >
74+ template <size_t k, class ... Ts >
6775// ! \cond
6876typename enableIf<
69- k != 0 , typename ElemTypeHolder_<k, Tuple<Membs ...> >::type&>::type
77+ k != 0 , typename ElemTypeHolder_<k, Tuple<Ts ...> >::type&>::type
7078// ! \endcond
71- get (Tuple<Membs ...>& t) {
79+ get (Tuple<Ts ...>& t) {
7280 return get<k - 1 >(t.tail );
7381}
7482
7583
76- // ! Recursion terminator for `fill()`.
77- inline void fill (Tuple<>) {}
78-
79- /* !
80- * Fill a Tuple.
81- *
82- * \param t Tuple.
83- * \param head First element.
84- * \param tail Remaining elements.
85- */
86- template <class H , class ... Tail>
87- void fill (Tuple<H, Tail...>& t, H head, Tail... tail) {
88- t.head = head;
89- fill (t.tail , tail...);
90- }
91-
92-
9384/* ! \ingroup tuplehelper
9485 * Make a Tuple from a parameter pack.
9586 *
@@ -98,25 +89,7 @@ void fill(Tuple<H, Tail...>& t, H head, Tail... tail) {
9889 * \return Tuple containing `args`.
9990 */
10091template <class ... Args>
101- Tuple<Args...> pack (Args... args) {
102- Tuple<Args...> t;
103- fill (t, args...);
104-
92+ Tuple<Args...> makeTuple (Args... args) {
93+ Tuple<Args...> t {args...};
10594 return t;
10695}
107-
108-
109- /* ! \ingroup object
110- * Object.
111- */
112- template <class ... Membs>
113- struct Object : Tuple<Membs...> {
114- /*
115- * Preferably this would have been an alias, but this is not supported in
116- * C++11.
117- */
118- Object () {}
119- Object (Membs... args) : Tuple<Membs...>() {
120- fill (*dynamic_cast <Tuple<Membs...>*>(this ), args...);
121- }
122- };
0 commit comments