Make boost::tuple tuple-like to support structured bindings

This commit is contained in:
Peter Dimov
2018-01-03 19:26:11 +02:00
parent c51d8a9495
commit 16731d2689
6 changed files with 247 additions and 10 deletions

View File

@ -37,6 +37,7 @@
#include <boost/type_traits/cv_traits.hpp>
#include <boost/type_traits/function_traits.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/utility/swap.hpp>
#include <boost/detail/workaround.hpp> // needed for BOOST_WORKAROUND
@ -420,28 +421,28 @@ struct cons<HT, null_type> {
// templates for finding out the length of the tuple -------------------
template<class T>
struct length {
BOOST_STATIC_CONSTANT(int, value = 1 + length<typename T::tail_type>::value);
struct length: boost::integral_constant<int, 1 + length<typename T::tail_type>::value>
{
};
template<>
struct length<tuple<> > {
BOOST_STATIC_CONSTANT(int, value = 0);
struct length<tuple<> >: boost::integral_constant<int, 0>
{
};
template<>
struct length<tuple<> const> {
BOOST_STATIC_CONSTANT(int, value = 0);
struct length<tuple<> const>: boost::integral_constant<int, 0>
{
};
template<>
struct length<null_type> {
BOOST_STATIC_CONSTANT(int, value = 0);
struct length<null_type>: boost::integral_constant<int, 0>
{
};
template<>
struct length<null_type const> {
BOOST_STATIC_CONSTANT(int, value = 0);
struct length<null_type const>: boost::integral_constant<int, 0>
{
};
namespace detail {

View File

@ -63,5 +63,44 @@ get(const tuples::cons<HT, TT>& c) {
} // end namespace boost
#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
#include <tuple>
#include <cstddef>
namespace std
{
// std::tuple_size
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10>
struct tuple_size< boost::tuples::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >:
boost::tuples::length< boost::tuples::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >
{
};
template<class H, class T> struct tuple_size< boost::tuples::cons<H, T> >: boost::tuples::length< boost::tuples::cons<H, T> >
{
};
template<> struct tuple_size< boost::tuples::null_type >: boost::tuples::length< boost::tuples::null_type >
{
};
// std::tuple_element
template<std::size_t I, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10>
struct tuple_element< I, boost::tuples::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >:
boost::tuples::element< I, boost::tuples::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> >
{
};
template<std::size_t I, class H, class T> struct tuple_element< I, boost::tuples::cons<H, T> >: boost::tuples::element< I, boost::tuples::cons<H, T> >
{
};
} // namespace std
#endif // !defined(BOOST_NO_CXX11_HDR_TUPLE)
#endif // BOOST_TUPLE_HPP