forked from boostorg/tuple
Make boost::tuple tuple-like to support structured bindings
This commit is contained in:
@ -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 {
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user