Created on 2008-01-16.00:00:00 last changed 184 months ago
Proposed resolution:
Update header <utility> synopsis in [utility]
// 20.2.3, tuple-like access to pair: template <class T> class tuple_size; template <intsize_t I, class T> class tuple_element; template <class T1, class T2> struct tuple_size<std::pair<T1, T2> >; template <class T1, class T2> struct tuple_element<0, std::pair<T1, T2> >; template <class T1, class T2> struct tuple_element<1, std::pair<T1, T2> >; template<intsize_t I, class T1, class T2>Ptypename tuple_element<I, std::pair<T1, T2> >::type & get(std::pair<T1, T2>&); template<intsize_t I, class T1, class T2> constPtypename tuple_element<I, std::pair<T1, T2> >::type & get(const std::pair<T1, T2>&);
Update [pairs] Pairs
template<intsize_t I, class T1, class T2>Ptypename tuple_element<I, std::pair<T1, T2> >::type & get(pair<T1, T2>&); template<intsize_t I, class T1, class T2> constPtypename tuple_element<I, std::pair<T1, T2> >::type & get(const pair<T1, T2>&);
24 Return type: If
I == 0 then P is T1, if I == 1 then P is T2, and otherwise the program is ill-formed.
25 Returns: If I == 0 returns p.first, otherwise if I == 1 returns p.second, and otherwise the program is ill-formed.
Throws: Nothing.
Update header <tuple> synopsis in [tuple] with a APIs as below:
template <intsize_t I, class T> class tuple_element; // undefined template <intsize_t I, class... Types> class tuple_element<I, tuple<Types...> >; // 20.3.1.4, element access: template <intsize_t I, class... Types> typename tuple_element<I, tuple<Types...> >::type& get(tuple<Types...>&); template <intsize_t I, class ... types> typename tuple_element<I, tuple<Types...> >::type const& get(const tuple<Types...>&);
Update [tuple.helper] Tuple helper classes
template <intsize_t I, class... Types> class tuple_element<I, tuple<Types...> > { public: typedef TI type; };
1 Requires: . The program is ill-formed if 0 <= I and I < sizeof...(Types)I is out of bounds.
2 Type: TI is the type of the Ith element of Types, where indexing is zero-based.
Update [tuple.elem] Element access
template <intsize_t I, class... types > typename tuple_element<I, tuple<Types...> >::type& get(tuple<Types...>& t);
1 Requires: . The program is ill-formed if 0 <= I and I < sizeof...(Types)I is out of bounds.
Ith element of t, where indexing is zero-based.
Throws: Nothing.
template <intsize_t I, class... types> typename tuple_element<I, tuple<Types...> >::type const& get(const tuple<Types...>& t);
3 Requires: . The program is ill-formed if 0 <= I and I < sizeof...(Types)I is out of bounds.
4 Returns: A const reference to the Ith element of t, where indexing is zero-based.
Throws: Nothing.
Update header <array> synopsis in [utility]
template <class T> class tuple_size; // forward declaration template <intsize_t I, class T> class tuple_element; // forward declaration template <class T, size_t N> struct tuple_size<array<T, N> >; template <intsize_t I, class T, size_t N> struct tuple_element<I, array<T, N> >; template <intsize_t I, class T, size_t N> T& get(array<T, N>&); template <intsize_t I, class T, size_t N> const T& get(const array<T, N>&);
Update [array.tuple] Tuple interface to class template array
tuple_element<size_t I, array<T, N> >::type
3 Requires: The program is ill-formed if 0 <= I < N.I is out of bounds.
4 Value: The type T.
template <intsize_t I, class T, size_t N> T& get(array<T, N>& a);
5 Requires: . The program is ill-formed if 0 <= I < NI is out of bounds.
Returns: A reference to the Ith element of a, where indexing is zero-based.
Throws: Nothing.
template <intsize_t I, class T, size_t N> const T& get(const array<T, N>& a);
6 Requires: . The program is ill-formed if 0 <= I < NI is out of bounds.
7 Returns: A const reference to the Ith element of a, where indexing is zero-based.
Throws: Nothing.
The tuple element access API identifies the element in the sequence using signed integers, and then goes on to enforce the requirement that I be >= 0. There is a much easier way to do this - declare I as unsigned.
In fact the proposal is to use std::size_t, matching the
type used in the tuple_size API.
A second suggestion is that it is hard to imagine an API that deduces and index at compile time and returns a reference throwing an exception. Add a specific Throws: Nothing paragraph to each element access API.
In addition to tuple, update the API applies to
pair and array, and should be updated
accordingly.
A third observation is that the return type of the get
functions for std::pair is pseudo-code, but it is not
clearly marked as such. There is actually no need for pseudo-code as
the return type can be specified precisely with a call to
tuple_element. This is already done for
std::tuple, and std::array does not have a
problem as all elements are of type T.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2010-10-21 18:28:33 | admin | set | messages: + msg3735 |
| 2008-01-16 00:00:00 | admin | create | |