Document Number: N3761
Date: 2013-08-29
Author: Sean Middleditch <sean@seanmiddleditch.com>
Project: Programming Language C++, Library Working Group
Reply-To:
Sean Middleditch
Proposing type_at<>
Overview
The standard library currently is missing utility templates for extracting types from a variadic template type list, requiring users to instantiate a std::tuple<> in order to extract a type from a specific position within a variadic template type list.
A simple library addition can make certain recurisve uses of variadic templates easier and not dependent on the unrelated concept of a tuple.
This proposal is a pure library addition with no language changes or backwards compatibility regressions. The proposed language for value_at<> depends on N3638, though it could be written without this requirement using type_at<> instead.
Discussion
This paper proposes the new library names type_at and value_at. Some alternative names, should the proposed one be deemed unacceptable, include:
- nth_type and nth_value
- get_type and get_value
- unpack_type and unpack_value
- type_i and value_i
- index_type and index_value
Proposal
In "Header synopsis" in [utility], add:
template <unsigned N, typename T, typename ...R>
struct type_at {
using type = typename type_at<N - 1, R...>::type;
};
template <typename T, typename ...R>
struct type_at<0, T, R...> {
using type = T;
};
template <unsigned N, typename T, typename ...R>
auto value_at(T&&, R&&... r) -> decltype(auto) {
return value_at<N - 1, R...>(std::forward<R>(r)...);
}
template
auto value_at(T&& t, R&&...) -> decltype(auto) {
return std::forward<T>(t);
}